From cf69fee366fdeda8debc2eb7cd1a521d761cb8ca Mon Sep 17 00:00:00 2001 From: howard Date: Sun, 21 Mar 2021 14:39:59 -0700 Subject: [PATCH] working hardcode line pair --- dist/CDemo.js | 1 - dist/CDemo.wasm | Bin 115903 -> 0 bytes dist/bundle.js | 2 +- dist/solver.js | 137 ++++++++++++-- dist/solver.wasm | Bin 18343 -> 137292 bytes src/Sketcher.js | 9 +- wasm/notes | 139 +++++++++++++- wasm/solver.c | 471 ++++++++++++++++++++++++++++------------------- 8 files changed, 551 insertions(+), 208 deletions(-) delete mode 100644 dist/CDemo.js delete mode 100755 dist/CDemo.wasm diff --git a/dist/CDemo.js b/dist/CDemo.js deleted file mode 100644 index e99c7b3..0000000 --- a/dist/CDemo.js +++ /dev/null @@ -1 +0,0 @@ -var Module=typeof Module!=="undefined"?Module:{};var moduleOverrides={};var key;for(key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}var arguments_=[];var thisProgram="./this.program";var quit_=function(status,toThrow){throw toThrow};var ENVIRONMENT_IS_WEB=false;var ENVIRONMENT_IS_WORKER=false;var ENVIRONMENT_IS_NODE=false;var ENVIRONMENT_IS_SHELL=false;ENVIRONMENT_IS_WEB=typeof window==="object";ENVIRONMENT_IS_WORKER=typeof importScripts==="function";ENVIRONMENT_IS_NODE=typeof process==="object"&&typeof process.versions==="object"&&typeof process.versions.node==="string";ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER;var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var read_,readAsync,readBinary,setWindowTitle;var nodeFS;var nodePath;if(ENVIRONMENT_IS_NODE){if(ENVIRONMENT_IS_WORKER){scriptDirectory=require("path").dirname(scriptDirectory)+"/"}else{scriptDirectory=__dirname+"/"}read_=function shell_read(filename,binary){if(!nodeFS)nodeFS=require("fs");if(!nodePath)nodePath=require("path");filename=nodePath["normalize"](filename);return nodeFS["readFileSync"](filename,binary?null:"utf8")};readBinary=function readBinary(filename){var ret=read_(filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}assert(ret.buffer);return ret};if(process["argv"].length>1){thisProgram=process["argv"][1].replace(/\\/g,"/")}arguments_=process["argv"].slice(2);if(typeof module!=="undefined"){module["exports"]=Module}process["on"]("uncaughtException",function(ex){if(!(ex instanceof ExitStatus)){throw ex}});process["on"]("unhandledRejection",abort);quit_=function(status){process["exit"](status)};Module["inspect"]=function(){return"[Emscripten Module object]"}}else if(ENVIRONMENT_IS_SHELL){if(typeof read!="undefined"){read_=function shell_read(f){return read(f)}}readBinary=function readBinary(f){var data;if(typeof readbuffer==="function"){return new Uint8Array(readbuffer(f))}data=read(f,"binary");assert(typeof data==="object");return data};if(typeof scriptArgs!="undefined"){arguments_=scriptArgs}else if(typeof arguments!="undefined"){arguments_=arguments}if(typeof quit==="function"){quit_=function(status){quit(status)}}if(typeof print!=="undefined"){if(typeof console==="undefined")console={};console.log=print;console.warn=console.error=typeof printErr!=="undefined"?printErr:print}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!=="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.lastIndexOf("/")+1)}else{scriptDirectory=""}{read_=function(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){readBinary=function(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=function(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=function(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}setWindowTitle=function(title){document.title=title}}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.warn.bind(console);for(key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];var noExitRuntime=Module["noExitRuntime"]||true;if(typeof WebAssembly!=="object"){abort("no native wasm support detected")}var wasmMemory;var ABORT=false;var EXITSTATUS;function assert(condition,text){if(!condition){abort("Assertion failed: "+text)}}var UTF8Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf8"):undefined;function UTF8ArrayToString(heap,idx,maxBytesToRead){var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heap[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&heap.subarray&&UTF8Decoder){return UTF8Decoder.decode(heap.subarray(idx,endPtr))}else{var str="";while(idx>10,56320|ch&1023)}}}return str}function UTF8ToString(ptr,maxBytesToRead){return ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):""}function stringToUTF8Array(str,heap,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx}function lengthBytesUTF8(str){var len=0;for(var i=0;i=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127)++len;else if(u<=2047)len+=2;else if(u<=65535)len+=3;else len+=4}return len}function allocateUTF8OnStack(str){var size=lengthBytesUTF8(str)+1;var ret=stackAlloc(size);stringToUTF8Array(str,HEAP8,ret,size);return ret}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferAndViews(buf){buffer=buf;Module["HEAP8"]=HEAP8=new Int8Array(buf);Module["HEAP16"]=HEAP16=new Int16Array(buf);Module["HEAP32"]=HEAP32=new Int32Array(buf);Module["HEAPU8"]=HEAPU8=new Uint8Array(buf);Module["HEAPU16"]=HEAPU16=new Uint16Array(buf);Module["HEAPU32"]=HEAPU32=new Uint32Array(buf);Module["HEAPF32"]=HEAPF32=new Float32Array(buf);Module["HEAPF64"]=HEAPF64=new Float64Array(buf)}var INITIAL_MEMORY=Module["INITIAL_MEMORY"]||134217728;var wasmTable;var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;__ATINIT__.push({func:function(){___wasm_call_ctors()}});function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){runtimeExited=true}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module["preloadedImages"]={};Module["preloadedAudios"]={};function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}what+="";err(what);ABORT=true;EXITSTATUS=1;what="abort("+what+"). Build with -s ASSERTIONS=1 for more info.";var e=new WebAssembly.RuntimeError(what);throw e}function hasPrefix(str,prefix){return String.prototype.startsWith?str.startsWith(prefix):str.indexOf(prefix)===0}var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return hasPrefix(filename,dataURIPrefix)}var fileURIPrefix="file://";function isFileURI(filename){return hasPrefix(filename,fileURIPrefix)}var wasmBinaryFile="CDemo.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinary(file){try{if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}else{throw"both async and sync fetching of the wasm failed"}}catch(err){abort(err)}}function getBinaryPromise(){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)){if(typeof fetch==="function"&&!isFileURI(wasmBinaryFile)){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){if(!response["ok"]){throw"failed to load wasm binary file at '"+wasmBinaryFile+"'"}return response["arrayBuffer"]()}).catch(function(){return getBinary(wasmBinaryFile)})}else{if(readAsync){return new Promise(function(resolve,reject){readAsync(wasmBinaryFile,function(response){resolve(new Uint8Array(response))},reject)})}}}return Promise.resolve().then(function(){return getBinary(wasmBinaryFile)})}function createWasm(){var info={"a":asmLibraryArg};function receiveInstance(instance,module){var exports=instance.exports;Module["asm"]=exports;wasmMemory=Module["asm"]["j"];updateGlobalBufferAndViews(wasmMemory.buffer);wasmTable=Module["asm"]["p"];removeRunDependency("wasm-instantiate")}addRunDependency("wasm-instantiate");function receiveInstantiatedSource(output){receiveInstance(output["instance"])}function instantiateArrayBuffer(receiver){return getBinaryPromise().then(function(binary){return WebAssembly.instantiate(binary,info)}).then(receiver,function(reason){err("failed to asynchronously prepare wasm: "+reason);abort(reason)})}function instantiateAsync(){if(!wasmBinary&&typeof WebAssembly.instantiateStreaming==="function"&&!isDataURI(wasmBinaryFile)&&!isFileURI(wasmBinaryFile)&&typeof fetch==="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){var result=WebAssembly.instantiateStreaming(response,info);return result.then(receiveInstantiatedSource,function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(receiveInstantiatedSource)})})}else{return instantiateArrayBuffer(receiveInstantiatedSource)}}if(Module["instantiateWasm"]){try{var exports=Module["instantiateWasm"](info,receiveInstance);return exports}catch(e){err("Module.instantiateWasm callback failed with error: "+e);return false}}instantiateAsync();return{}}function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback=="function"){callback(Module);continue}var func=callback.func;if(typeof func==="number"){if(callback.arg===undefined){wasmTable.get(func)()}else{wasmTable.get(func)(callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}var ExceptionInfoAttrs={DESTRUCTOR_OFFSET:0,REFCOUNT_OFFSET:4,TYPE_OFFSET:8,CAUGHT_OFFSET:12,RETHROWN_OFFSET:13,SIZE:16};function ___cxa_allocate_exception(size){return _malloc(size+ExceptionInfoAttrs.SIZE)+ExceptionInfoAttrs.SIZE}function ExceptionInfo(excPtr){this.excPtr=excPtr;this.ptr=excPtr-ExceptionInfoAttrs.SIZE;this.set_type=function(type){HEAP32[this.ptr+ExceptionInfoAttrs.TYPE_OFFSET>>2]=type};this.get_type=function(){return HEAP32[this.ptr+ExceptionInfoAttrs.TYPE_OFFSET>>2]};this.set_destructor=function(destructor){HEAP32[this.ptr+ExceptionInfoAttrs.DESTRUCTOR_OFFSET>>2]=destructor};this.get_destructor=function(){return HEAP32[this.ptr+ExceptionInfoAttrs.DESTRUCTOR_OFFSET>>2]};this.set_refcount=function(refcount){HEAP32[this.ptr+ExceptionInfoAttrs.REFCOUNT_OFFSET>>2]=refcount};this.set_caught=function(caught){caught=caught?1:0;HEAP8[this.ptr+ExceptionInfoAttrs.CAUGHT_OFFSET>>0]=caught};this.get_caught=function(){return HEAP8[this.ptr+ExceptionInfoAttrs.CAUGHT_OFFSET>>0]!=0};this.set_rethrown=function(rethrown){rethrown=rethrown?1:0;HEAP8[this.ptr+ExceptionInfoAttrs.RETHROWN_OFFSET>>0]=rethrown};this.get_rethrown=function(){return HEAP8[this.ptr+ExceptionInfoAttrs.RETHROWN_OFFSET>>0]!=0};this.init=function(type,destructor){this.set_type(type);this.set_destructor(destructor);this.set_refcount(0);this.set_caught(false);this.set_rethrown(false)};this.add_ref=function(){var value=HEAP32[this.ptr+ExceptionInfoAttrs.REFCOUNT_OFFSET>>2];HEAP32[this.ptr+ExceptionInfoAttrs.REFCOUNT_OFFSET>>2]=value+1};this.release_ref=function(){var prev=HEAP32[this.ptr+ExceptionInfoAttrs.REFCOUNT_OFFSET>>2];HEAP32[this.ptr+ExceptionInfoAttrs.REFCOUNT_OFFSET>>2]=prev-1;return prev===1}}var exceptionLast=0;var uncaughtExceptionCount=0;function ___cxa_throw(ptr,type,destructor){var info=new ExceptionInfo(ptr);info.init(type,destructor);exceptionLast=ptr;uncaughtExceptionCount++;throw ptr}function _abort(){abort()}function _emscripten_memcpy_big(dest,src,num){HEAPU8.copyWithin(dest,src,src+num)}function abortOnCannotGrowMemory(requestedSize){abort("OOM")}function _emscripten_resize_heap(requestedSize){abortOnCannotGrowMemory(requestedSize)}function _exit(status){exit(status)}var SYSCALLS={mappings:{},buffers:[null,[],[]],printChar:function(stream,curr){var buffer=SYSCALLS.buffers[stream];if(curr===0||curr===10){(stream===1?out:err)(UTF8ArrayToString(buffer,0));buffer.length=0}else{buffer.push(curr)}},varargs:undefined,get:function(){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret},getStr:function(ptr){var ret=UTF8ToString(ptr);return ret},get64:function(low,high){return low}};function _fd_close(fd){return 0}function _fd_seek(fd,offset_low,offset_high,whence,newOffset){}function _fd_write(fd,iov,iovcnt,pnum){var num=0;for(var i=0;i>2];var len=HEAP32[iov+(i*8+4)>>2];for(var j=0;j>2]=num;return 0}var asmLibraryArg={"h":___cxa_allocate_exception,"g":___cxa_throw,"b":_abort,"d":_emscripten_memcpy_big,"e":_emscripten_resize_heap,"i":_exit,"f":_fd_close,"c":_fd_seek,"a":_fd_write};var asm=createWasm();var ___wasm_call_ctors=Module["___wasm_call_ctors"]=function(){return(___wasm_call_ctors=Module["___wasm_call_ctors"]=Module["asm"]["k"]).apply(null,arguments)};var _Example2d=Module["_Example2d"]=function(){return(_Example2d=Module["_Example2d"]=Module["asm"]["l"]).apply(null,arguments)};var _solost=Module["_solost"]=function(){return(_solost=Module["_solost"]=Module["asm"]["m"]).apply(null,arguments)};var _main=Module["_main"]=function(){return(_main=Module["_main"]=Module["asm"]["n"]).apply(null,arguments)};var _malloc=Module["_malloc"]=function(){return(_malloc=Module["_malloc"]=Module["asm"]["o"]).apply(null,arguments)};var stackAlloc=Module["stackAlloc"]=function(){return(stackAlloc=Module["stackAlloc"]=Module["asm"]["q"]).apply(null,arguments)};var calledRun;function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}var calledMain=false;dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function callMain(args){var entryFunction=Module["_main"];args=args||[];var argc=args.length+1;var argv=stackAlloc((argc+1)*4);HEAP32[argv>>2]=allocateUTF8OnStack(thisProgram);for(var i=1;i>2)+i]=allocateUTF8OnStack(args[i-1])}HEAP32[(argv>>2)+argc]=0;try{var ret=entryFunction(argc,argv);exit(ret,true)}catch(e){if(e instanceof ExitStatus){return}else if(e=="unwind"){noExitRuntime=true;return}else{var toLog=e;if(e&&typeof e==="object"&&e.stack){toLog=[e,e.stack]}err("exception thrown: "+toLog);quit_(1,e)}}finally{calledMain=true}}function run(args){args=args||arguments_;if(runDependencies>0){return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();preMain();if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();if(shouldRunNow)callMain(args);postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}Module["run"]=run;function exit(status,implicit){if(implicit&&noExitRuntime&&status===0){return}if(noExitRuntime){}else{EXITSTATUS=status;exitRuntime();if(Module["onExit"])Module["onExit"](status);ABORT=true}quit_(status,new ExitStatus(status))}if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}var shouldRunNow=true;if(Module["noInitialRun"])shouldRunNow=false;run(); diff --git a/dist/CDemo.wasm b/dist/CDemo.wasm deleted file mode 100755 index dca050947588e4fa93f96e1e99506a7809c0a344..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 115903 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 diff --git a/dist/bundle.js b/dist/bundle.js index baba7e7..ce76c00 100644 --- a/dist/bundle.js +++ b/dist/bundle.js @@ -4026,7 +4026,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac \*************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"Sketcher\": () => (/* binding */ Sketcher)\n/* harmony export */ });\n/* harmony import */ var three__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! three */ \"./node_modules/three/build/three.module.js\");\n/* harmony import */ var _node_modules_three_src_Three__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../node_modules/three/src/Three */ \"./node_modules/three/src/Three.js\");\n\n\n\n\n\nclass Sketcher extends _node_modules_three_src_Three__WEBPACK_IMPORTED_MODULE_0__.Group {\n constructor(camera, domElement, plane) {\n super()\n this.camera = camera;\n this.domElement = domElement;\n this.scene = scene;\n this.plane = plane;\n this.matrixAutoUpdate = false;\n this.sketchNormal = new _node_modules_three_src_Three__WEBPACK_IMPORTED_MODULE_0__.Vector3(0, 0, 1)\n this.orientSketcher(plane)\n\n\n this.add(new _node_modules_three_src_Three__WEBPACK_IMPORTED_MODULE_0__.PlaneHelper(this.plane, 1, 0xffff00));\n\n\n this.linesGroup = new _node_modules_three_src_Three__WEBPACK_IMPORTED_MODULE_0__.Group()\n this.linesArr = this.linesGroup.children\n this.pointsGroup = new _node_modules_three_src_Three__WEBPACK_IMPORTED_MODULE_0__.Group()\n this.ptsArr = this.pointsGroup.children\n this.add(this.linesGroup)\n this.add(this.pointsGroup)\n\n window.lg = this.linesArr\n window.pg = this.ptsArr\n\n this.pickThreshold = 100\n this.grabbedObject = null\n\n this.lineMaterial = new _node_modules_three_src_Three__WEBPACK_IMPORTED_MODULE_0__.LineBasicMaterial({\n color: 0x555,\n })\n this.pointMaterial = new _node_modules_three_src_Three__WEBPACK_IMPORTED_MODULE_0__.PointsMaterial({\n color: 0xAAA,\n size: 3,\n })\n\n this.pointStart = this.pointStart.bind(this);\n this.pointEnd = this.pointEnd.bind(this);\n this.move = this.move.bind(this);\n this.keyHandler = this.keyHandler.bind(this);\n this.picker = this.picker.bind(this);\n this.grabbedMove = this.grabbedMove.bind(this);\n this.grabEnd = this.grabEnd.bind(this);\n this.raycaster = new _node_modules_three_src_Three__WEBPACK_IMPORTED_MODULE_0__.Raycaster();\n\n\n window.addEventListener('keydown', this.keyHandler)\n domElement.addEventListener('pointerdown', this.picker)\n\n\n this.mode = \"\"\n\n\n }\n\n orientSketcher() {\n\n const theta = this.sketchNormal.angleTo(this.plane.normal)\n const axis = this.sketchNormal.clone().cross(this.plane.normal).normalize()\n const rot = new _node_modules_three_src_Three__WEBPACK_IMPORTED_MODULE_0__.Matrix4().makeRotationAxis(axis, theta)\n const trans = new _node_modules_three_src_Three__WEBPACK_IMPORTED_MODULE_0__.Matrix4().makeTranslation(0, 0, this.plane.constant)\n\n this.matrix = rot.multiply(trans) // world matrix will auto update in next render\n this.inverse = this.matrix.clone().invert()\n\n }\n\n keyHandler(e) {\n switch (e.key) {\n case 'Escape':\n this.clear()\n this.mode = \"\"\n break;\n case 'l':\n this.addLine()\n this.mode = \"line\"\n break;\n case 'b':\n this.writeBuff()\n break;\n case '=':\n this.plane.applyMatrix4(new three__WEBPACK_IMPORTED_MODULE_1__.Matrix4().makeRotationY(0.1))\n this.orientSketcher()\n\n this.dispatchEvent({ type: 'change' })\n break;\n case '-':\n this.plane.applyMatrix4(new three__WEBPACK_IMPORTED_MODULE_1__.Matrix4().makeRotationY(-0.1))\n this.orientSketcher()\n\n this.dispatchEvent({ type: 'change' })\n break;\n }\n }\n\n\n picker(e) {\n if (this.mode || e.buttons != 1) return\n this.raycaster.setFromCamera(\n new _node_modules_three_src_Three__WEBPACK_IMPORTED_MODULE_0__.Vector2(\n (e.clientX / window.innerWidth) * 2 - 1,\n - (e.clientY / window.innerHeight) * 2 + 1\n ),\n this.camera\n );\n\n // console.log(this.ptsArr)\n const candidates = this.raycaster.intersectObjects(this.ptsArr)\n // console.log(candidates)\n\n\n if (!candidates.length) return;\n\n let minDist = candidates[0].distanceToRay\n let idx = 0\n\n for (let i = 1; i < candidates.length; i++) {\n if (candidates.distanceToRay < minDist) {\n minDist = candidates.distanceToRay\n idx = i\n }\n }\n\n if (minDist < this.pickThreshold) {\n this.grabPtIdx = this.ptsArr.indexOf(\n candidates[idx].object\n )\n } else {\n return\n }\n\n this.domElement.addEventListener('pointermove', this.grabbedMove);\n this.domElement.addEventListener('pointerup', this.grabEnd);\n }\n\n grabbedMove(e) {\n const mouseLoc = this.getLocation(e);\n\n this.moveLinePt(this.grabPtIdx, mouseLoc)\n\n this.dispatchEvent({ type: 'change' })\n }\n\n moveLinePt(ptIdx, absPos) {\n this.ptsArr[ptIdx].geometry.attributes.position.set(absPos);\n this.ptsArr[ptIdx].geometry.attributes.position.needsUpdate = true;\n\n const lineIdx = Math.floor(ptIdx / 2)\n const endPtIdx = (ptIdx % 2) * 3\n this.linesArr[lineIdx].geometry.attributes.position.set(absPos, endPtIdx)\n this.linesArr[lineIdx].geometry.attributes.position.needsUpdate = true;\n }\n\n grabEnd() {\n this.domElement.removeEventListener('pointermove', this.grabbedMove)\n this.domElement.removeEventListener('pointerup', this.grabEnd)\n this.ptsArr[this.grabPtIdx].geometry.computeBoundingSphere()\n // this.grabbedObject = null\n }\n\n\n addLine() {\n this.domElement.addEventListener('pointerdown', this.pointStart)\n }\n\n clear() {\n if (this.mode == \"\") return\n\n this.domElement.removeEventListener('pointerdown', this.pointStart)\n this.domElement.removeEventListener('pointermove', this.move);\n this.domElement.removeEventListener('pointerdown', this.pointEnd);\n this.domElement.removeEventListener('pointerdown', this.pointEnd);\n\n const lastLine = this.linesArr[this.linesArr.length - 1]\n this.linesGroup.remove(lastLine)\n lastLine.geometry.dispose()\n\n const lastPoints = this.ptsArr.slice(this.ptsArr.length - 2)\n this.pointsGroup.remove(...lastPoints)\n lastPoints.forEach(obj => obj.geometry.dispose())\n\n this.dispatchEvent({ type: 'change' })\n }\n\n getLocation(e) {\n this.raycaster.setFromCamera(\n new _node_modules_three_src_Three__WEBPACK_IMPORTED_MODULE_0__.Vector2(\n (e.clientX / window.innerWidth) * 2 - 1,\n - (e.clientY / window.innerHeight) * 2 + 1\n ),\n this.camera\n );\n // return this.worldToLocal(this.raycaster.ray.intersectPlane(this.plane)).toArray()\n return this.raycaster.ray.intersectPlane(this.plane).applyMatrix4(this.inverse).toArray()\n }\n\n pointStart(e) {\n if (e.buttons !== 1) return\n const mouseLoc = this.getLocation(e);\n\n this.lineGeom = new _node_modules_three_src_Three__WEBPACK_IMPORTED_MODULE_0__.BufferGeometry()\n this.lineGeom.setAttribute('position',\n new _node_modules_three_src_Three__WEBPACK_IMPORTED_MODULE_0__.BufferAttribute(\n new Float32Array(6), 3\n )\n );\n this.lineGeom.attributes.position.set(mouseLoc)\n this.line = new _node_modules_three_src_Three__WEBPACK_IMPORTED_MODULE_0__.LineSegments(this.lineGeom, this.lineMaterial);\n this.line.frustumCulled = false;\n this.linesGroup.add(this.line)\n\n this.p1Geom = new _node_modules_three_src_Three__WEBPACK_IMPORTED_MODULE_0__.BufferGeometry()\n this.p1Geom.setAttribute('position',\n new _node_modules_three_src_Three__WEBPACK_IMPORTED_MODULE_0__.BufferAttribute(\n new Float32Array(3), 3\n )\n );\n this.p1Geom.attributes.position.set(mouseLoc)\n this.p1 = new _node_modules_three_src_Three__WEBPACK_IMPORTED_MODULE_0__.Points(this.p1Geom, this.pointMaterial);\n this.pointsGroup.add(this.p1)\n\n this.p2Geom = new _node_modules_three_src_Three__WEBPACK_IMPORTED_MODULE_0__.BufferGeometry()\n this.p2Geom.setAttribute('position',\n new _node_modules_three_src_Three__WEBPACK_IMPORTED_MODULE_0__.BufferAttribute(\n new Float32Array(3), 3\n )\n );\n this.p2 = new _node_modules_three_src_Three__WEBPACK_IMPORTED_MODULE_0__.Points(this.p2Geom, this.pointMaterial);\n this.pointsGroup.add(this.p2)\n\n this.domElement.removeEventListener('pointerdown', this.pointStart)\n this.domElement.addEventListener('pointermove', this.move)\n this.domElement.addEventListener('pointerdown', this.pointEnd)\n }\n\n\n move(e) {\n const mouseLoc = this.getLocation(e);\n this.lineGeom.attributes.position.set(mouseLoc, 3)\n this.lineGeom.attributes.position.needsUpdate = true;\n this.p2Geom.attributes.position.set(mouseLoc);\n this.p2Geom.attributes.position.needsUpdate = true;\n this.p2Geom.computeBoundingSphere();\n this.dispatchEvent({ type: 'change' })\n }\n\n pointEnd(e) {\n if (e.buttons !== 1) return;\n this.domElement.removeEventListener('pointermove', this.move);\n this.domElement.removeEventListener('pointerdown', this.pointEnd);\n\n\n this.pointStart(e)\n }\n\n writeBuff() {\n // const linesBuf = new Float32Array(this.linesArr.length * 4)\n // const xyOnly = [0,1,3,4];\n // let p = 0\n // for (let i = 0; i < this.linesArr.length; i++) {\n // for (let j of xyOnly) {\n // linesBuf[p++] = this.linesArr[i].geometry.attributes.position.array[j]\n // }\n // }\n\n let ptsBuf = new Float32Array(this.ptsArr.length * 2)\n for (let i = 0, p = 0; i < this.ptsArr.length; i++) {\n for (let j = 0; j < 2; j++) {\n ptsBuf[p++] = this.ptsArr[i].geometry.attributes.position.array[j]\n }\n }\n console.log(ptsBuf)\n\n buffer = Module._malloc(ptsBuf.length * ptsBuf.BYTES_PER_ELEMENT)\n Module.HEAPF32.set(ptsBuf, buffer >> 2)\n\n Module[\"_solver\"](buffer)\n }\n}\n\n\n\n\n\n//# sourceURL=webpack:///./src/Sketcher.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"Sketcher\": () => (/* binding */ Sketcher)\n/* harmony export */ });\n/* harmony import */ var three__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! three */ \"./node_modules/three/build/three.module.js\");\n/* harmony import */ var _node_modules_three_src_Three__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../node_modules/three/src/Three */ \"./node_modules/three/src/Three.js\");\n\n\n\n\n\nclass Sketcher extends _node_modules_three_src_Three__WEBPACK_IMPORTED_MODULE_0__.Group {\n constructor(camera, domElement, plane) {\n super()\n this.camera = camera;\n this.domElement = domElement;\n this.scene = scene;\n this.plane = plane;\n this.matrixAutoUpdate = false;\n this.sketchNormal = new _node_modules_three_src_Three__WEBPACK_IMPORTED_MODULE_0__.Vector3(0, 0, 1)\n this.orientSketcher(plane)\n\n\n this.add(new _node_modules_three_src_Three__WEBPACK_IMPORTED_MODULE_0__.PlaneHelper(this.plane, 1, 0xffff00));\n\n\n this.linesGroup = new _node_modules_three_src_Three__WEBPACK_IMPORTED_MODULE_0__.Group()\n this.linesArr = this.linesGroup.children\n this.pointsGroup = new _node_modules_three_src_Three__WEBPACK_IMPORTED_MODULE_0__.Group()\n this.ptsArr = this.pointsGroup.children\n this.add(this.linesGroup)\n this.add(this.pointsGroup)\n\n window.lg = this.linesArr\n window.pg = this.ptsArr\n\n this.pickThreshold = 100\n this.grabbedObject = null\n\n this.lineMaterial = new _node_modules_three_src_Three__WEBPACK_IMPORTED_MODULE_0__.LineBasicMaterial({\n color: 0x555,\n })\n this.pointMaterial = new _node_modules_three_src_Three__WEBPACK_IMPORTED_MODULE_0__.PointsMaterial({\n color: 0xAAA,\n size: 3,\n })\n\n this.pointStart = this.pointStart.bind(this);\n this.pointEnd = this.pointEnd.bind(this);\n this.move = this.move.bind(this);\n this.keyHandler = this.keyHandler.bind(this);\n this.picker = this.picker.bind(this);\n this.grabbedMove = this.grabbedMove.bind(this);\n this.grabEnd = this.grabEnd.bind(this);\n this.raycaster = new _node_modules_three_src_Three__WEBPACK_IMPORTED_MODULE_0__.Raycaster();\n\n\n window.addEventListener('keydown', this.keyHandler)\n domElement.addEventListener('pointerdown', this.picker)\n\n\n this.mode = \"\"\n\n\n }\n\n orientSketcher() {\n\n const theta = this.sketchNormal.angleTo(this.plane.normal)\n const axis = this.sketchNormal.clone().cross(this.plane.normal).normalize()\n const rot = new _node_modules_three_src_Three__WEBPACK_IMPORTED_MODULE_0__.Matrix4().makeRotationAxis(axis, theta)\n const trans = new _node_modules_three_src_Three__WEBPACK_IMPORTED_MODULE_0__.Matrix4().makeTranslation(0, 0, this.plane.constant)\n\n this.matrix = rot.multiply(trans) // world matrix will auto update in next render\n this.inverse = this.matrix.clone().invert()\n\n }\n\n keyHandler(e) {\n switch (e.key) {\n case 'Escape':\n this.clear()\n this.mode = \"\"\n break;\n case 'l':\n this.addLine()\n this.mode = \"line\"\n break;\n case 'b':\n this.solve()\n break;\n case '=':\n this.plane.applyMatrix4(new three__WEBPACK_IMPORTED_MODULE_1__.Matrix4().makeRotationY(0.1))\n this.orientSketcher()\n\n this.dispatchEvent({ type: 'change' })\n break;\n case '-':\n this.plane.applyMatrix4(new three__WEBPACK_IMPORTED_MODULE_1__.Matrix4().makeRotationY(-0.1))\n this.orientSketcher()\n\n this.dispatchEvent({ type: 'change' })\n break;\n }\n }\n\n\n picker(e) {\n if (this.mode || e.buttons != 1) return\n this.raycaster.setFromCamera(\n new _node_modules_three_src_Three__WEBPACK_IMPORTED_MODULE_0__.Vector2(\n (e.clientX / window.innerWidth) * 2 - 1,\n - (e.clientY / window.innerHeight) * 2 + 1\n ),\n this.camera\n );\n\n // console.log(this.ptsArr)\n const candidates = this.raycaster.intersectObjects(this.ptsArr)\n // console.log(candidates)\n\n\n if (!candidates.length) return;\n\n let minDist = candidates[0].distanceToRay\n let idx = 0\n\n for (let i = 1; i < candidates.length; i++) {\n if (candidates.distanceToRay < minDist) {\n minDist = candidates.distanceToRay\n idx = i\n }\n }\n\n if (minDist < this.pickThreshold) {\n this.grabPtIdx = this.ptsArr.indexOf(\n candidates[idx].object\n )\n } else {\n return\n }\n\n this.domElement.addEventListener('pointermove', this.grabbedMove);\n this.domElement.addEventListener('pointerup', this.grabEnd);\n }\n\n grabbedMove(e) {\n const mouseLoc = this.getLocation(e);\n\n this.moveLinePt(this.grabPtIdx, mouseLoc)\n\n this.dispatchEvent({ type: 'change' })\n }\n\n moveLinePt(ptIdx, absPos) {\n this.ptsArr[ptIdx].geometry.attributes.position.set(absPos);\n this.ptsArr[ptIdx].geometry.attributes.position.needsUpdate = true;\n\n const lineIdx = Math.floor(ptIdx / 2)\n const endPtIdx = (ptIdx % 2) * 3\n this.linesArr[lineIdx].geometry.attributes.position.set(absPos, endPtIdx)\n this.linesArr[lineIdx].geometry.attributes.position.needsUpdate = true;\n }\n\n grabEnd() {\n this.domElement.removeEventListener('pointermove', this.grabbedMove)\n this.domElement.removeEventListener('pointerup', this.grabEnd)\n this.ptsArr[this.grabPtIdx].geometry.computeBoundingSphere()\n // this.grabbedObject = null\n }\n\n\n addLine() {\n this.domElement.addEventListener('pointerdown', this.pointStart)\n }\n\n clear() {\n if (this.mode == \"\") return\n\n this.domElement.removeEventListener('pointerdown', this.pointStart)\n this.domElement.removeEventListener('pointermove', this.move);\n this.domElement.removeEventListener('pointerdown', this.pointEnd);\n this.domElement.removeEventListener('pointerdown', this.pointEnd);\n\n const lastLine = this.linesArr[this.linesArr.length - 1]\n this.linesGroup.remove(lastLine)\n lastLine.geometry.dispose()\n\n const lastPoints = this.ptsArr.slice(this.ptsArr.length - 2)\n this.pointsGroup.remove(...lastPoints)\n lastPoints.forEach(obj => obj.geometry.dispose())\n\n this.dispatchEvent({ type: 'change' })\n }\n\n getLocation(e) {\n this.raycaster.setFromCamera(\n new _node_modules_three_src_Three__WEBPACK_IMPORTED_MODULE_0__.Vector2(\n (e.clientX / window.innerWidth) * 2 - 1,\n - (e.clientY / window.innerHeight) * 2 + 1\n ),\n this.camera\n );\n // return this.worldToLocal(this.raycaster.ray.intersectPlane(this.plane)).toArray()\n return this.raycaster.ray.intersectPlane(this.plane).applyMatrix4(this.inverse).toArray()\n }\n\n pointStart(e) {\n if (e.buttons !== 1) return\n const mouseLoc = this.getLocation(e);\n\n this.lineGeom = new _node_modules_three_src_Three__WEBPACK_IMPORTED_MODULE_0__.BufferGeometry()\n this.lineGeom.setAttribute('position',\n new _node_modules_three_src_Three__WEBPACK_IMPORTED_MODULE_0__.BufferAttribute(\n new Float32Array(6), 3\n )\n );\n this.lineGeom.attributes.position.set(mouseLoc)\n this.line = new _node_modules_three_src_Three__WEBPACK_IMPORTED_MODULE_0__.LineSegments(this.lineGeom, this.lineMaterial);\n this.line.frustumCulled = false;\n this.linesGroup.add(this.line)\n\n this.p1Geom = new _node_modules_three_src_Three__WEBPACK_IMPORTED_MODULE_0__.BufferGeometry()\n this.p1Geom.setAttribute('position',\n new _node_modules_three_src_Three__WEBPACK_IMPORTED_MODULE_0__.BufferAttribute(\n new Float32Array(3), 3\n )\n );\n this.p1Geom.attributes.position.set(mouseLoc)\n this.p1 = new _node_modules_three_src_Three__WEBPACK_IMPORTED_MODULE_0__.Points(this.p1Geom, this.pointMaterial);\n this.pointsGroup.add(this.p1)\n\n this.p2Geom = new _node_modules_three_src_Three__WEBPACK_IMPORTED_MODULE_0__.BufferGeometry()\n this.p2Geom.setAttribute('position',\n new _node_modules_three_src_Three__WEBPACK_IMPORTED_MODULE_0__.BufferAttribute(\n new Float32Array(3), 3\n )\n );\n this.p2 = new _node_modules_three_src_Three__WEBPACK_IMPORTED_MODULE_0__.Points(this.p2Geom, this.pointMaterial);\n this.pointsGroup.add(this.p2)\n\n this.domElement.removeEventListener('pointerdown', this.pointStart)\n this.domElement.addEventListener('pointermove', this.move)\n this.domElement.addEventListener('pointerdown', this.pointEnd)\n }\n\n\n move(e) {\n const mouseLoc = this.getLocation(e);\n this.lineGeom.attributes.position.set(mouseLoc, 3)\n this.lineGeom.attributes.position.needsUpdate = true;\n this.p2Geom.attributes.position.set(mouseLoc);\n this.p2Geom.attributes.position.needsUpdate = true;\n this.p2Geom.computeBoundingSphere();\n this.dispatchEvent({ type: 'change' })\n }\n\n pointEnd(e) {\n if (e.buttons !== 1) return;\n this.domElement.removeEventListener('pointermove', this.move);\n this.domElement.removeEventListener('pointerdown', this.pointEnd);\n\n\n this.pointStart(e)\n }\n\n solve() {\n // const linesBuf = new Float32Array(this.linesArr.length * 4)\n // const xyOnly = [0,1,3,4];\n // let p = 0\n // for (let i = 0; i < this.linesArr.length; i++) {\n // for (let j of xyOnly) {\n // linesBuf[p++] = this.linesArr[i].geometry.attributes.position.array[j]\n // }\n // }\n\n let ptsBuf = new Float32Array(this.ptsArr.length * 2)\n for (let i = 0, p = 0; i < this.ptsArr.length; i++) {\n for (let j = 0; j < 2; j++) {\n ptsBuf[p++] = this.ptsArr[i].geometry.attributes.position.array[j]\n }\n }\n\n buffer = Module._malloc(ptsBuf.length * ptsBuf.BYTES_PER_ELEMENT)\n Module.HEAPF32.set(ptsBuf, buffer >> 2)\n\n Module[\"_solver\"](this.ptsArr.length/2, buffer)\n\n Module._free(buffer)\n }\n}\n\n\n\n\n\n//# sourceURL=webpack:///./src/Sketcher.js?"); /***/ }), diff --git a/dist/solver.js b/dist/solver.js index 6adf626..30678c6 100644 --- a/dist/solver.js +++ b/dist/solver.js @@ -736,10 +736,6 @@ function cwrap(ident, returnType, argTypes, opts) { // We used to include malloc/free by default in the past. Show a helpful error in // builds with assertions. -function _free() { - // Show a helpful error since we used to include free by default in the past. - abort("free() called but not included in the build - add '_free' to EXPORTED_FUNCTIONS"); -} var ALLOC_NORMAL = 0; // Tries to use _malloc() var ALLOC_STACK = 1; // Lives for the duration of the current function call @@ -1199,7 +1195,7 @@ function updateGlobalBufferAndViews(buf) { var TOTAL_STACK = 5242880; if (Module['TOTAL_STACK']) assert(TOTAL_STACK === Module['TOTAL_STACK'], 'the stack size can no longer be determined at runtime') -var INITIAL_MEMORY = Module['INITIAL_MEMORY'] || 16777216; +var INITIAL_MEMORY = Module['INITIAL_MEMORY'] || 134217728; if (!Object.getOwnPropertyDescriptor(Module, 'INITIAL_MEMORY')) { Object.defineProperty(Module, 'INITIAL_MEMORY', { configurable: true, @@ -1217,7 +1213,7 @@ assert(typeof Int32Array !== 'undefined' && typeof Float64Array !== 'undefined' // If memory is defined in wasm, the user can't provide it. assert(!Module['wasmMemory'], 'Use of `wasmMemory` detected. Use -s IMPORTED_MEMORY to define wasmMemory externally'); -assert(INITIAL_MEMORY == 16777216, 'Detected runtime INITIAL_MEMORY setting. Use -s IMPORTED_MEMORY to define wasmMemory dynamically'); +assert(INITIAL_MEMORY == 134217728, 'Detected runtime INITIAL_MEMORY setting. Use -s IMPORTED_MEMORY to define wasmMemory dynamically'); // include: runtime_init_table.js // In regular non-RELOCATABLE mode the table is exported @@ -1615,7 +1611,7 @@ function createWasm() { // This assertion doesn't hold when emscripten is run in --post-link // mode. // TODO(sbc): Read INITIAL_MEMORY out of the wasm file in post-link mode. - //assert(wasmMemory.buffer.byteLength === 16777216); + //assert(wasmMemory.buffer.byteLength === 134217728); updateGlobalBufferAndViews(wasmMemory.buffer); wasmTable = Module['asm']['__indirect_function_table']; @@ -1767,6 +1763,100 @@ var ASM_CONSTS = { return demangleAll(js); } + var ExceptionInfoAttrs={DESTRUCTOR_OFFSET:0,REFCOUNT_OFFSET:4,TYPE_OFFSET:8,CAUGHT_OFFSET:12,RETHROWN_OFFSET:13,SIZE:16}; + function ___cxa_allocate_exception(size) { + // Thrown object is prepended by exception metadata block + return _malloc(size + ExceptionInfoAttrs.SIZE) + ExceptionInfoAttrs.SIZE; + } + + function _atexit(func, arg) { + } + function ___cxa_atexit(a0,a1 + ) { + return _atexit(a0,a1); + } + + function ExceptionInfo(excPtr) { + this.excPtr = excPtr; + this.ptr = excPtr - ExceptionInfoAttrs.SIZE; + + this.set_type = function(type) { + HEAP32[(((this.ptr)+(ExceptionInfoAttrs.TYPE_OFFSET))>>2)] = type; + }; + + this.get_type = function() { + return HEAP32[(((this.ptr)+(ExceptionInfoAttrs.TYPE_OFFSET))>>2)]; + }; + + this.set_destructor = function(destructor) { + HEAP32[(((this.ptr)+(ExceptionInfoAttrs.DESTRUCTOR_OFFSET))>>2)] = destructor; + }; + + this.get_destructor = function() { + return HEAP32[(((this.ptr)+(ExceptionInfoAttrs.DESTRUCTOR_OFFSET))>>2)]; + }; + + this.set_refcount = function(refcount) { + HEAP32[(((this.ptr)+(ExceptionInfoAttrs.REFCOUNT_OFFSET))>>2)] = refcount; + }; + + this.set_caught = function (caught) { + caught = caught ? 1 : 0; + HEAP8[(((this.ptr)+(ExceptionInfoAttrs.CAUGHT_OFFSET))>>0)] = caught; + }; + + this.get_caught = function () { + return HEAP8[(((this.ptr)+(ExceptionInfoAttrs.CAUGHT_OFFSET))>>0)] != 0; + }; + + this.set_rethrown = function (rethrown) { + rethrown = rethrown ? 1 : 0; + HEAP8[(((this.ptr)+(ExceptionInfoAttrs.RETHROWN_OFFSET))>>0)] = rethrown; + }; + + this.get_rethrown = function () { + return HEAP8[(((this.ptr)+(ExceptionInfoAttrs.RETHROWN_OFFSET))>>0)] != 0; + }; + + // Initialize native structure fields. Should be called once after allocated. + this.init = function(type, destructor) { + this.set_type(type); + this.set_destructor(destructor); + this.set_refcount(0); + this.set_caught(false); + this.set_rethrown(false); + } + + this.add_ref = function() { + var value = HEAP32[(((this.ptr)+(ExceptionInfoAttrs.REFCOUNT_OFFSET))>>2)]; + HEAP32[(((this.ptr)+(ExceptionInfoAttrs.REFCOUNT_OFFSET))>>2)] = value + 1; + }; + + // Returns true if last reference released. + this.release_ref = function() { + var prev = HEAP32[(((this.ptr)+(ExceptionInfoAttrs.REFCOUNT_OFFSET))>>2)]; + HEAP32[(((this.ptr)+(ExceptionInfoAttrs.REFCOUNT_OFFSET))>>2)] = prev - 1; + assert(prev > 0); + return prev === 1; + }; + } + + var exceptionLast=0; + + var uncaughtExceptionCount=0; + function ___cxa_throw(ptr, type, destructor) { + var info = new ExceptionInfo(ptr); + // Initialize ExceptionInfo content after it was allocated in __cxa_allocate_exception. + info.init(type, destructor); + exceptionLast = ptr; + uncaughtExceptionCount++; + throw ptr + " - Exception catching is disabled, this exception cannot be caught. Compile with -s DISABLE_EXCEPTION_CATCHING=0 or DISABLE_EXCEPTION_CATCHING=2 to catch."; + } + + function _abort() { + abort(); + } + function _emscripten_memcpy_big(dest, src, num) { HEAPU8.copyWithin(dest, src, src + num); } @@ -1788,14 +1878,6 @@ var ASM_CONSTS = { exit(status); } - function flush_NO_FILESYSTEM() { - // flush anything remaining in the buffers during shutdown - if (typeof _fflush !== 'undefined') _fflush(0); - var buffers = SYSCALLS.buffers; - if (buffers[1].length) SYSCALLS.printChar(1, 10); - if (buffers[2].length) SYSCALLS.printChar(2, 10); - } - var SYSCALLS={mappings:{},buffers:[null,[],[]],printChar:function(stream, curr) { var buffer = SYSCALLS.buffers[stream]; assert(buffer); @@ -1818,6 +1900,22 @@ var ASM_CONSTS = { else assert(high === -1); return low; }}; + function _fd_close(fd) { + abort('it should not be possible to operate on streams when !SYSCALLS_REQUIRE_FILESYSTEM'); + return 0; + } + + function _fd_seek(fd, offset_low, offset_high, whence, newOffset) { + abort('it should not be possible to operate on streams when !SYSCALLS_REQUIRE_FILESYSTEM'); + } + + function flush_NO_FILESYSTEM() { + // flush anything remaining in the buffers during shutdown + if (typeof _fflush !== 'undefined') _fflush(0); + var buffers = SYSCALLS.buffers; + if (buffers[1].length) SYSCALLS.printChar(1, 10); + if (buffers[2].length) SYSCALLS.printChar(2, 10); + } function _fd_write(fd, iov, iovcnt, pnum) { // hack to support printf in SYSCALLS_REQUIRE_FILESYSTEM=0 var num = 0; @@ -1866,9 +1964,15 @@ function intArrayToString(array) { var asmLibraryArg = { + "__cxa_allocate_exception": ___cxa_allocate_exception, + "__cxa_atexit": ___cxa_atexit, + "__cxa_throw": ___cxa_throw, + "abort": _abort, "emscripten_memcpy_big": _emscripten_memcpy_big, "emscripten_resize_heap": _emscripten_resize_heap, "exit": _exit, + "fd_close": _fd_close, + "fd_seek": _fd_seek, "fd_write": _fd_write, "setTempRet0": _setTempRet0 }; @@ -1885,6 +1989,9 @@ var _main = Module["_main"] = createExportWrapper("main"); /** @type {function(...*):?} */ var _malloc = Module["_malloc"] = createExportWrapper("malloc"); +/** @type {function(...*):?} */ +var _free = Module["_free"] = createExportWrapper("free"); + /** @type {function(...*):?} */ var ___errno_location = Module["___errno_location"] = createExportWrapper("__errno_location"); diff --git a/dist/solver.wasm b/dist/solver.wasm index 90433a5d95b7aaf88fc46a8a09180f5fad56692f..f6efd4e747fa6a993245efeb3cc2f1367344f52e 100755 GIT binary patch literal 137292 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 NSWW+n+m2)s{{(R-E4=^! delta 4441 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 0) + { + sys.constraint[sys.constraints++] = Slvs_MakeConstraint( + con_id++, g, + SLVS_C_POINTS_COINCIDENT, + 200, + 0.0, + pt_id - 1, pt_id - 2, 0, 0); + } + else + { + sys.constraint[sys.constraints++] = Slvs_MakeConstraint( + con_id++, g, + SLVS_C_POINTS_COINCIDENT, + 200, + 0.0, + pt_id - 1, 101, 0, 0); + } + + printf("h:%i\n", h); + + sys.param[sys.params++] = Slvs_MakeParam(h++, g, (float)*ptr++); + sys.param[sys.params++] = Slvs_MakeParam(h++, g, (float)*ptr++); + + sys.entity[sys.entities++] = Slvs_MakePoint2d(pt_id++, g, 200, h - 2, h - 1); + + sys.entity[sys.entities++] = Slvs_MakeLineSegment(line_id++, g, + 200, pt_id - 1, pt_id - 2); + + sys.constraint[sys.constraints++] = Slvs_MakeConstraint( + con_id++, g, + SLVS_C_PT_PT_DISTANCE, + 200, + 30.0, + pt_id - 1, pt_id - 2, 0, 0); + sys.constraint[sys.constraints++] = Slvs_MakeConstraint( + con_id++, g, + SLVS_C_VERTICAL, + 200, + 0.0, + 0, 0, line_id-1, 0); + } + + /* If the solver fails, then ask it to report which constraints caused + * the problem. */ + sys.calculateFaileds = 1; + + sys.dragged[0] = 10; + sys.dragged[1] = 11; + sys.dragged[2] = 14; + sys.dragged[3] = 15; + + /* And solve. */ + Slvs_Solve(&sys, g); + + // printf("%i,wtf\n", sys.result); + if (sys.result == SLVS_RESULT_OKAY) + { + printf("solved okay\n"); + + for (int i = 0; i < nLines * 4; i++) + { + // *buf_pt_start++ = (float)sys.param[ptStart++].val; + printf("%f\n", sys.param[ptStart++].val); + } + } + else + { + int i; + printf("solve failed: problematic constraints are:"); + for (i = 0; i < sys.faileds; i++) + { + printf(" %d", sys.failed[i]); + } + printf("\n"); + if (sys.result == SLVS_RESULT_INCONSISTENT) + { + printf("system inconsistent\n"); + } + else + { + printf("system nonconvergent\n"); + } + } + sys.params = sys.constraints = sys.entities = 0; + return 0; +} \ No newline at end of file diff --git a/wasm/solver.c b/wasm/solver.c index 7cafa87..d82920e 100644 --- a/wasm/solver.c +++ b/wasm/solver.c @@ -6,7 +6,7 @@ * Copyright 2008-2013 Jonathan Westhues. *---------------------------------------------------------------------------*/ #ifdef WIN32 -# include +#include #endif #include #include @@ -19,12 +19,13 @@ static Slvs_System sys; static void *CheckMalloc(size_t n) { - void *r = malloc(n); - if(!r) { - printf("out of memory!\n"); - exit(-1); - } - return r; + void *r = malloc(n); + if (!r) + { + printf("out of memory!\n"); + exit(-1); + } + return r; } /*----------------------------------------------------------------------------- @@ -33,49 +34,52 @@ static void *CheckMalloc(size_t n) *---------------------------------------------------------------------------*/ void Example3d() { - /* This will contain a single group, which will arbitrarily number 1. */ - Slvs_hGroup g = 1; + /* This will contain a single group, which will arbitrarily number 1. */ + Slvs_hGroup g = 1; - /* A point, initially at (x y z) = (10 10 10) */ - sys.param[sys.params++] = Slvs_MakeParam(1, g, 10.0); - sys.param[sys.params++] = Slvs_MakeParam(2, g, 10.0); - sys.param[sys.params++] = Slvs_MakeParam(3, g, 10.0); - sys.entity[sys.entities++] = Slvs_MakePoint3d(101, g, 1, 2, 3); - /* and a second point at (20 20 20) */ - sys.param[sys.params++] = Slvs_MakeParam(4, g, 20.0); - sys.param[sys.params++] = Slvs_MakeParam(5, g, 20.0); - sys.param[sys.params++] = Slvs_MakeParam(6, g, 20.0); - sys.entity[sys.entities++] = Slvs_MakePoint3d(102, g, 4, 5, 6); - /* and a line segment connecting them. */ - sys.entity[sys.entities++] = Slvs_MakeLineSegment(200, g, - SLVS_FREE_IN_3D, 101, 102); + /* A point, initially at (x y z) = (10 10 10) */ + sys.param[sys.params++] = Slvs_MakeParam(1, g, 10.0); + sys.param[sys.params++] = Slvs_MakeParam(2, g, 10.0); + sys.param[sys.params++] = Slvs_MakeParam(3, g, 10.0); + sys.entity[sys.entities++] = Slvs_MakePoint3d(101, g, 1, 2, 3); + /* and a second point at (20 20 20) */ + sys.param[sys.params++] = Slvs_MakeParam(4, g, 20.0); + sys.param[sys.params++] = Slvs_MakeParam(5, g, 20.0); + sys.param[sys.params++] = Slvs_MakeParam(6, g, 20.0); + sys.entity[sys.entities++] = Slvs_MakePoint3d(102, g, 4, 5, 6); + /* and a line segment connecting them. */ + sys.entity[sys.entities++] = Slvs_MakeLineSegment(200, g, + SLVS_FREE_IN_3D, 101, 102); - /* The distance between the points should be 30.0 units. */ - sys.constraint[sys.constraints++] = Slvs_MakeConstraint( - 1, g, - SLVS_C_PT_PT_DISTANCE, - SLVS_FREE_IN_3D, - 30.0, - 101, 102, 0, 0); + /* The distance between the points should be 30.0 units. */ + sys.constraint[sys.constraints++] = Slvs_MakeConstraint( + 1, g, + SLVS_C_PT_PT_DISTANCE, + SLVS_FREE_IN_3D, + 30.0, + 101, 102, 0, 0); - /* Let's tell the solver to keep the second point as close to constant + /* Let's tell the solver to keep the second point as close to constant * as possible, instead moving the first point. */ - sys.dragged[0] = 4; - sys.dragged[1] = 5; - sys.dragged[2] = 6; + // sys.dragged[0] = 4; + // sys.dragged[1] = 5; + // sys.dragged[2] = 6; - /* Now that we have written our system, we solve. */ - Slvs_Solve(&sys, g); + /* Now that we have written our system, we solve. */ + Slvs_Solve(&sys, g); - if(sys.result == SLVS_RESULT_OKAY) { - printf("okay; now at (%.3f %.3f %.3f)\n" - " (%.3f %.3f %.3f)\n", - sys.param[0].val, sys.param[1].val, sys.param[2].val, - sys.param[3].val, sys.param[4].val, sys.param[5].val); - printf("%d DOF\n", sys.dof); - } else { - printf("solve failed"); - } + if (sys.result == SLVS_RESULT_OKAY) + { + printf("okay; now at (%.3f %.3f %.3f)\n" + " (%.3f %.3f %.3f)\n", + sys.param[0].val, sys.param[1].val, sys.param[2].val, + sys.param[3].val, sys.param[4].val, sys.param[5].val); + printf("%d DOF\n", sys.dof); + } + else + { + printf("solve failed"); + } } /*----------------------------------------------------------------------------- @@ -85,108 +89,107 @@ void Example3d() *---------------------------------------------------------------------------*/ void Example2d(float xx) { - Slvs_hGroup g; - double qw, qx, qy, qz; + Slvs_hGroup g; + double qw, qx, qy, qz; - g = 1; - /* First, we create our workplane. Its origin corresponds to the origin + g = 1; + /* First, we create our workplane. Its origin corresponds to the origin * of our base frame (x y z) = (0 0 0) */ - sys.param[sys.params++] = Slvs_MakeParam(1, g, 0.0); - sys.param[sys.params++] = Slvs_MakeParam(2, g, 0.0); - sys.param[sys.params++] = Slvs_MakeParam(3, g, 0.0); - sys.entity[sys.entities++] = Slvs_MakePoint3d(101, g, 1, 2, 3); - /* and it is parallel to the xy plane, so it has basis vectors (1 0 0) + sys.param[sys.params++] = Slvs_MakeParam(1, g, 0.0); + sys.param[sys.params++] = Slvs_MakeParam(2, g, 0.0); + sys.param[sys.params++] = Slvs_MakeParam(3, g, 0.0); + sys.entity[sys.entities++] = Slvs_MakePoint3d(101, g, 1, 2, 3); + /* and it is parallel to the xy plane, so it has basis vectors (1 0 0) * and (0 1 0). */ - Slvs_MakeQuaternion(1, 0, 0, - 0, 1, 0, &qw, &qx, &qy, &qz); - sys.param[sys.params++] = Slvs_MakeParam(4, g, qw); - sys.param[sys.params++] = Slvs_MakeParam(5, g, qx); - sys.param[sys.params++] = Slvs_MakeParam(6, g, qy); - sys.param[sys.params++] = Slvs_MakeParam(7, g, qz); - sys.entity[sys.entities++] = Slvs_MakeNormal3d(102, g, 4, 5, 6, 7); + Slvs_MakeQuaternion(1, 0, 0, + 0, 1, 0, &qw, &qx, &qy, &qz); + sys.param[sys.params++] = Slvs_MakeParam(4, g, qw); + sys.param[sys.params++] = Slvs_MakeParam(5, g, qx); + sys.param[sys.params++] = Slvs_MakeParam(6, g, qy); + sys.param[sys.params++] = Slvs_MakeParam(7, g, qz); + sys.entity[sys.entities++] = Slvs_MakeNormal3d(102, g, 4, 5, 6, 7); - sys.entity[sys.entities++] = Slvs_MakeWorkplane(200, g, 101, 102); + sys.entity[sys.entities++] = Slvs_MakeWorkplane(200, g, 101, 102); - /* Now create a second group. We'll solve group 2, while leaving group 1 + /* Now create a second group. We'll solve group 2, while leaving group 1 * constant; so the workplane that we've created will be locked down, * and the solver can't move it. */ - g = 2; - /* These points are represented by their coordinates (u v) within the + g = 2; + /* These points are represented by their coordinates (u v) within the * workplane, so they need only two parameters each. */ - sys.param[sys.params++] = Slvs_MakeParam(11, g, 10.0); - sys.param[sys.params++] = Slvs_MakeParam(12, g, 20.0); - sys.entity[sys.entities++] = Slvs_MakePoint2d(301, g, 200, 11, 12); + sys.param[sys.params++] = Slvs_MakeParam(11, g, 10.0); + sys.param[sys.params++] = Slvs_MakeParam(12, g, 20.0); + sys.entity[sys.entities++] = Slvs_MakePoint2d(301, g, 200, 11, 12); - sys.param[sys.params++] = Slvs_MakeParam(13, g, 20.0); - sys.param[sys.params++] = Slvs_MakeParam(14, g, 10.0); - sys.entity[sys.entities++] = Slvs_MakePoint2d(302, g, 200, 13, 14); + sys.param[sys.params++] = Slvs_MakeParam(13, g, 20.0); + sys.param[sys.params++] = Slvs_MakeParam(14, g, 10.0); + sys.entity[sys.entities++] = Slvs_MakePoint2d(302, g, 200, 13, 14); - /* And we create a line segment with those endpoints. */ - sys.entity[sys.entities++] = Slvs_MakeLineSegment(400, g, - 200, 301, 302); + /* And we create a line segment with those endpoints. */ + sys.entity[sys.entities++] = Slvs_MakeLineSegment(400, g, + 200, 301, 302); - /* Now three more points. */ - - sys.param[sys.params++] = Slvs_MakeParam(15, g, 110.0); - sys.param[sys.params++] = Slvs_MakeParam(16, g, 120.0); - sys.entity[sys.entities++] = Slvs_MakePoint2d(303, g, 200, 15, 16); + /* Now three more points. */ - sys.param[sys.params++] = Slvs_MakeParam(17, g, 120.0); - sys.param[sys.params++] = Slvs_MakeParam(18, g, 110.0); - sys.entity[sys.entities++] = Slvs_MakePoint2d(304, g, 200, 17, 18); + sys.param[sys.params++] = Slvs_MakeParam(15, g, 110.0); + sys.param[sys.params++] = Slvs_MakeParam(16, g, 120.0); + sys.entity[sys.entities++] = Slvs_MakePoint2d(303, g, 200, 15, 16); - sys.param[sys.params++] = Slvs_MakeParam(19, g, 115.0); - sys.param[sys.params++] = Slvs_MakeParam(20, g, xx); - sys.entity[sys.entities++] = Slvs_MakePoint2d(305, g, 200, 19, 20); + sys.param[sys.params++] = Slvs_MakeParam(17, g, 120.0); + sys.param[sys.params++] = Slvs_MakeParam(18, g, 110.0); + sys.entity[sys.entities++] = Slvs_MakePoint2d(304, g, 200, 17, 18); - /* And arc, centered at point 303, starting at point 304, ending at + sys.param[sys.params++] = Slvs_MakeParam(19, g, 115.0); + sys.param[sys.params++] = Slvs_MakeParam(20, g, xx); + sys.entity[sys.entities++] = Slvs_MakePoint2d(305, g, 200, 19, 20); + + /* And arc, centered at point 303, starting at point 304, ending at * point 305. */ - sys.entity[sys.entities++] = Slvs_MakeArcOfCircle(401, g, 200, 102, - 303, 304, 305); + sys.entity[sys.entities++] = Slvs_MakeArcOfCircle(401, g, 200, 102, + 303, 304, 305); - /* Now one more point, and a distance */ - sys.param[sys.params++] = Slvs_MakeParam(21, g, 200.0); - sys.param[sys.params++] = Slvs_MakeParam(22, g, 200.0); - sys.entity[sys.entities++] = Slvs_MakePoint2d(306, g, 200, 21, 22); + /* Now one more point, and a distance */ + sys.param[sys.params++] = Slvs_MakeParam(21, g, 200.0); + sys.param[sys.params++] = Slvs_MakeParam(22, g, 200.0); + sys.entity[sys.entities++] = Slvs_MakePoint2d(306, g, 200, 21, 22); - sys.param[sys.params++] = Slvs_MakeParam(23, g, 30.0); - sys.entity[sys.entities++] = Slvs_MakeDistance(307, g, 200, 23); + sys.param[sys.params++] = Slvs_MakeParam(23, g, 30.0); + sys.entity[sys.entities++] = Slvs_MakeDistance(307, g, 200, 23); - /* And a complete circle, centered at point 306 with radius equal to + /* And a complete circle, centered at point 306 with radius equal to * distance 307. The normal is 102, the same as our workplane. */ - sys.entity[sys.entities++] = Slvs_MakeCircle(402, g, 200, - 306, 102, 307); + sys.entity[sys.entities++] = Slvs_MakeCircle(402, g, 200, + 306, 102, 307); + /* The length of our line segment is 30.0 units. */ + sys.constraint[sys.constraints++] = Slvs_MakeConstraint( + 1, g, + SLVS_C_PT_PT_DISTANCE, + 200, + 30.0, + 301, 302, 0, 0); - /* The length of our line segment is 30.0 units. */ - sys.constraint[sys.constraints++] = Slvs_MakeConstraint( - 1, g, - SLVS_C_PT_PT_DISTANCE, - 200, - 30.0, - 301, 302, 0, 0); - - /* And the distance from our line segment to the origin is 10.0 units. */ - sys.constraint[sys.constraints++] = Slvs_MakeConstraint( - 2, g, - SLVS_C_PT_LINE_DISTANCE, - 200, - 10.0, - 101, 0, 400, 0); - /* And the line segment is vertical. */ - sys.constraint[sys.constraints++] = Slvs_MakeConstraint( - 3, g, - SLVS_C_VERTICAL, - 200, - 0.0, - 0, 0, 400, 0); - /* And the distance from one endpoint to the origin is 15.0 units. */ - sys.constraint[sys.constraints++] = Slvs_MakeConstraint( - 4, g, - SLVS_C_PT_PT_DISTANCE, - 200, - 15.0, - 301, 101, 0, 0); + /* And the distance from our line segment to the origin is 10.0 units. */ + sys.constraint[sys.constraints++] = Slvs_MakeConstraint( + 2, g, + SLVS_C_PT_LINE_DISTANCE, + 200, + 10.0, + 101, 0, 400, 0); + /* And the line segment is vertical. */ + sys.constraint[sys.constraints++] = Slvs_MakeConstraint( + 3, g, + SLVS_C_VERTICAL, + 200, + 0.0, + 0, 0, 400, 0); + /* And the distance from one endpoint to the origin is 15.0 units. */ + sys.constraint[sys.constraints++] = Slvs_MakeConstraint( + 4, g, + SLVS_C_PT_PT_DISTANCE, + 200, + 15.0, + 301, 101, 0, 0); #if 0 /* And same for the other endpoint; so if you add this constraint then * the sketch is overconstrained and will signal an error. */ @@ -198,84 +201,180 @@ void Example2d(float xx) 302, 101, 0, 0); #endif /* 0 */ - /* The arc and the circle have equal radius. */ - sys.constraint[sys.constraints++] = Slvs_MakeConstraint( - 6, g, - SLVS_C_EQUAL_RADIUS, - 200, - 0.0, - 0, 0, 401, 402); - /* The arc has radius 17.0 units. */ - sys.constraint[sys.constraints++] = Slvs_MakeConstraint( - 7, g, - SLVS_C_DIAMETER, - 200, - 17.0*2, - 0, 0, 401, 0); + /* The arc and the circle have equal radius. */ + sys.constraint[sys.constraints++] = Slvs_MakeConstraint( + 6, g, + SLVS_C_EQUAL_RADIUS, + 200, + 0.0, + 0, 0, 401, 402); + /* The arc has radius 17.0 units. */ + sys.constraint[sys.constraints++] = Slvs_MakeConstraint( + 7, g, + SLVS_C_DIAMETER, + 200, + 17.0 * 2, + 0, 0, 401, 0); - /* If the solver fails, then ask it to report which constraints caused + /* If the solver fails, then ask it to report which constraints caused * the problem. */ - sys.calculateFaileds = 1; + sys.calculateFaileds = 1; - /* And solve. */ - Slvs_Solve(&sys, g); + /* And solve. */ + Slvs_Solve(&sys, g); - if(sys.result == SLVS_RESULT_OKAY) { - printf("solved okay\n"); - printf("line from (%.3f %.3f) to (%.3f %.3f)\n", - sys.param[7].val, sys.param[8].val, - sys.param[9].val, sys.param[10].val); + if (sys.result == SLVS_RESULT_OKAY) + { + printf("solved okay\n"); + printf("line from (%.3f %.3f) to (%.3f %.3f)\n", + sys.param[7].val, sys.param[8].val, + sys.param[9].val, sys.param[10].val); - printf("arc center (%.3f %.3f) start (%.3f %.3f) finish (%.3f %.3f)\n", - sys.param[11].val, sys.param[12].val, - sys.param[13].val, sys.param[14].val, - sys.param[15].val, sys.param[16].val); + printf("arc center (%.3f %.3f) start (%.3f %.3f) finish (%.3f %.3f)\n", + sys.param[11].val, sys.param[12].val, + sys.param[13].val, sys.param[14].val, + sys.param[15].val, sys.param[16].val); - printf("circle center (%.3f %.3f) radius %.3f\n", - sys.param[17].val, sys.param[18].val, - sys.param[19].val); - printf("%d DOF\n", sys.dof); - } else { - int i; - printf("solve failed: problematic constraints are:"); - for(i = 0; i < sys.faileds; i++) { - printf(" %d", sys.failed[i]); - } - printf("\n"); - if(sys.result == SLVS_RESULT_INCONSISTENT) { - printf("system inconsistent\n"); - } else { - printf("system nonconvergent\n"); - } + printf("circle center (%.3f %.3f) radius %.3f\n", + sys.param[17].val, sys.param[18].val, + sys.param[19].val); + printf("%d DOF\n", sys.dof); + } + else + { + int i; + printf("solve failed: problematic constraints are:"); + for (i = 0; i < sys.faileds; i++) + { + printf(" %d", sys.failed[i]); } + printf("\n"); + if (sys.result == SLVS_RESULT_INCONSISTENT) + { + printf("system inconsistent\n"); + } + else + { + printf("system nonconvergent\n"); + } + } } - -int solver(float *ptr) +int solver(int nLines, float *ptr) { + // for (int i=0; i