great stuff

This commit is contained in:
Daniel Ledda
2021-06-08 17:29:29 +02:00
parent e7b8ae6120
commit c8f37d0d98
65 changed files with 3309 additions and 3331 deletions

1
.gitignore vendored
View File

@@ -2,3 +2,4 @@
/public/build/
/.vscode
/.idea
/src/solver/node_modules/

117
.idea/workspace.xml generated
View File

@@ -2,32 +2,58 @@
<project version="4">
<component name="ChangeListManager">
<list default="true" id="70635ef7-86ab-4681-b98d-dc8e4999995b" name="Default Changelist" comment="">
<change afterPath="$PROJECT_DIR$/public/solver/main.js" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/OBJLoader.js" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/RotationControl.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/SolutionList.svelte" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/deno.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/soma.iml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/soma.iml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/public/solver/as-bind.esm.js" afterDir="false" />
<change afterPath="$PROJECT_DIR$/public/solver/main.wasm" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/SomaSolver.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/solver/assembly/SomaSolution.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/solver/assembly/VoxelSpace.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/ui/Interactor.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/ui/Solution2D.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/ui/SolutionList.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/ui/threedee/GeometryManager.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/ui/threedee/PolycubeMesh.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/ui/threedee/PolycubeScene.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.gitignore" beforeDir="false" afterPath="$PROJECT_DIR$/.gitignore" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.vscode/extensions.json" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/.vscode/settings.json" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/package-lock.json" beforeDir="false" afterPath="$PROJECT_DIR$/package-lock.json" afterDir="false" />
<change beforePath="$PROJECT_DIR$/package.json" beforeDir="false" afterPath="$PROJECT_DIR$/package.json" afterDir="false" />
<change beforePath="$PROJECT_DIR$/report.20210524.173340.100206.0.001.json" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/report.20210524.182447.107803.0.001.json" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/App.svelte" beforeDir="false" afterPath="$PROJECT_DIR$/src/App.svelte" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/CubeInput.svelte" beforeDir="false" afterPath="$PROJECT_DIR$/src/CubeInput.svelte" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/OrbitControls.js" beforeDir="false" afterPath="$PROJECT_DIR$/src/OrbitControls_OLD_THREE.js" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/Polycube3D.svelte" beforeDir="false" afterPath="$PROJECT_DIR$/src/Polycube3D.svelte" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/Sidebar.svelte" beforeDir="false" afterPath="$PROJECT_DIR$/src/Sidebar.svelte" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/SolutionInteractor.svelte" beforeDir="false" afterPath="$PROJECT_DIR$/src/SolutionInteractor.svelte" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/solver/SomaSolution.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/solver/SomaSolution.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/solver/SomaSolver.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/solver/SomaSolver.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/solver/VoxelSpace.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/solver/VoxelSpace.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/solver/main.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/solver/main.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/solver/main.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/public/global.css" beforeDir="false" afterPath="$PROJECT_DIR$/public/global.css" afterDir="false" />
<change beforePath="$PROJECT_DIR$/public/index.html" beforeDir="false" afterPath="$PROJECT_DIR$/public/index.html" afterDir="false" />
<change beforePath="$PROJECT_DIR$/public/resources/bevel-cube/000000.mtl" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/public/resources/bevel-cube/000001.mtl" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/public/resources/bevel-cube/000001.obj" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/public/resources/bevel-cube/none.obj" beforeDir="false" afterPath="$PROJECT_DIR$/public/resources/c000000.obj" afterDir="false" />
<change beforePath="$PROJECT_DIR$/public/resources/bevel-cube/x.mtl" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/public/resources/bevel-cube/x.obj" beforeDir="false" afterPath="$PROJECT_DIR$/public/resources/c000001.obj" afterDir="false" />
<change beforePath="$PROJECT_DIR$/public/resources/bevel-cube/xy.mtl" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/public/resources/bevel-cube/xy.obj" beforeDir="false" afterPath="$PROJECT_DIR$/public/resources/c000011.obj" afterDir="false" />
<change beforePath="$PROJECT_DIR$/public/resources/bevel-cube/xymx.mtl" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/public/resources/bevel-cube/xymx.obj" beforeDir="false" afterPath="$PROJECT_DIR$/public/resources/c001011.obj" afterDir="false" />
<change beforePath="$PROJECT_DIR$/public/resources/bevel-cube/xymxmy.mtl" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/public/resources/bevel-cube/xymxmy.obj" beforeDir="false" afterPath="$PROJECT_DIR$/public/resources/c011011.obj" afterDir="false" />
<change beforePath="$PROJECT_DIR$/public/resources/bevel-cube/xyz.mtl" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/public/resources/bevel-cube/xyz.obj" beforeDir="false" afterPath="$PROJECT_DIR$/public/resources/c000111.obj" afterDir="false" />
<change beforePath="$PROJECT_DIR$/public/resources/bevel-cube/xyzmx.mtl" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/public/resources/bevel-cube/xyzmx.obj" beforeDir="false" afterPath="$PROJECT_DIR$/public/resources/c001111.obj" afterDir="false" />
<change beforePath="$PROJECT_DIR$/public/resources/bevel_cube.mtl" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/public/resources/bevel_cube.obj" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/public/solver/SomaSolver.js" beforeDir="false" afterPath="$PROJECT_DIR$/public/solver/SomaSolver.js" afterDir="false" />
<change beforePath="$PROJECT_DIR$/public/solver/main.js" beforeDir="false" afterPath="$PROJECT_DIR$/public/solver/main.js" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/App.svelte" beforeDir="false" afterPath="$PROJECT_DIR$/src/ui/App.svelte" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/CubeInput.svelte" beforeDir="false" afterPath="$PROJECT_DIR$/src/ui/CubeInput.svelte" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/OBJLoader.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/Polycube3D.svelte" beforeDir="false" afterPath="$PROJECT_DIR$/src/ui/SolutionViewer.svelte" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/PolycubeScene.ts" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/RotationControl.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/ui/threedee/RotationControl.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/Sidebar.svelte" beforeDir="false" afterPath="$PROJECT_DIR$/src/ui/Sidebar.svelte" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/SolutionInteractor.svelte" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/SolutionList.svelte" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/main.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/main.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/solver/SomaSolution.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/SomaSolution.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/solver/SomaSolver.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/solver/assembly/SomaSolver.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/solver/VoxelSpace.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/VoxelSpace.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/solver/main.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/solver/assembly/index.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/store.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/store.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/threeTest.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/PolycubeScene.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/tsconfig.json" beforeDir="false" afterPath="$PROJECT_DIR$/tsconfig.json" afterDir="false" />
</list>
<option name="SHOW_DIALOG" value="false" />
@@ -62,6 +88,7 @@
<property name="DefaultHtmlFileTemplate" value="HTML File" />
<property name="RunOnceActivity.OpenProjectViewOnStart" value="true" />
<property name="WebServerToolWindowFactoryState" value="false" />
<property name="last_opened_file_path" value="$PROJECT_DIR$/src/ui" />
<property name="node.js.detected.package.eslint" value="true" />
<property name="node.js.detected.package.tslint" value="true" />
<property name="node.js.path.for.package.eslint" value="project" />
@@ -71,15 +98,21 @@
<property name="nodejs_package_manager_path" value="npm" />
<property name="settings.editor.selected.configurable" value="terminal" />
<property name="ts.external.directory.path" value="$PROJECT_DIR$/node_modules/typescript/lib" />
<property name="use.deno.dismiss" value="true" />
<property name="vue.rearranger.settings.migration" value="true" />
</component>
<component name="RecentsManager">
<key name="MoveFile.RECENT_KEYS">
<recent name="$PROJECT_DIR$/public/solver" />
<recent name="$PROJECT_DIR$/public" />
<recent name="$PROJECT_DIR$/src" />
<recent name="$PROJECT_DIR$" />
<recent name="$PROJECT_DIR$/src/ui" />
<recent name="$PROJECT_DIR$/src/solver" />
<recent name="$PROJECT_DIR$/src/ui/threedee" />
<recent name="$PROJECT_DIR$/src/webapp" />
</key>
<key name="CopyFile.RECENT_KEYS">
<recent name="$PROJECT_DIR$/src/ui" />
<recent name="$PROJECT_DIR$/public/solver" />
<recent name="$PROJECT_DIR$/src" />
</key>
</component>
<component name="RunManager">
@@ -110,6 +143,10 @@
<workItem from="1622369635484" duration="590000" />
<workItem from="1622486075975" duration="8190000" />
<workItem from="1622536594904" duration="1883000" />
<workItem from="1622710203767" duration="11181000" />
<workItem from="1622971349849" duration="20106000" />
<workItem from="1623052849485" duration="37878000" />
<workItem from="1623141089245" duration="24731000" />
</task>
<servers />
</component>
@@ -117,11 +154,21 @@
<option name="version" value="3" />
<option name="exactExcludedFiles">
<list>
<option value="$PROJECT_DIR$/src/OrbitControls.js" />
<option value="$PROJECT_DIR$/src/solver/assembly/index.js" />
<option value="$PROJECT_DIR$/src/solver/assembly/SomaSolution.js" />
<option value="$PROJECT_DIR$/src/solver/assembly/SomaSolver.js" />
<option value="$PROJECT_DIR$/src/solver/assembly/VoxelSpace.js" />
<option value="$PROJECT_DIR$/src/solver/assembly/SomaSolution.js" />
<option value="$PROJECT_DIR$/src/solver/assembly/SomaSolver.js" />
<option value="$PROJECT_DIR$/src/solver/assembly/VoxelSpace.js" />
</list>
</option>
</component>
<component name="WindowStateProjectService">
<state x="633" y="342" width="643" height="403" key="#com.intellij.fileTypes.FileTypeChooser" timestamp="1623101908210">
<screen x="0" y="27" width="1920" height="1053" />
</state>
<state x="633" y="342" width="643" height="403" key="#com.intellij.fileTypes.FileTypeChooser/1920.0.1920.1080/0.27.1920.1053@0.27.1920.1053" timestamp="1623101908210" />
<state x="643" y="194" width="614" height="706" key="#com.intellij.refactoring.rename.AutomaticRenamingDialog" timestamp="1621349929863">
<screen x="0" y="27" width="1920" height="1053" />
</state>
@@ -130,26 +177,30 @@
<screen x="0" y="27" width="1920" height="1053" />
</state>
<state x="743" y="301" width="716" height="623" key="FileChooserDialogImpl/1920.0.1920.1080/0.27.1920.1053@0.27.1920.1053" timestamp="1621932819206" />
<state x="449" y="175" width="1022" height="737" key="SettingsEditor" timestamp="1622295807965">
<state x="449" y="175" width="1022" height="737" key="SettingsEditor" timestamp="1623054791330">
<screen x="0" y="27" width="1920" height="1053" />
</state>
<state x="449" y="175" width="1022" height="737" key="SettingsEditor/1920.0.1920.1080/0.27.1920.1053@0.27.1920.1053" timestamp="1622295807965" />
<state x="449" y="175" width="1022" height="737" key="SettingsEditor/1920.0.1920.1080/0.27.1920.1053@0.27.1920.1053" timestamp="1623054791330" />
<state x="741" y="455" width="438" height="177" key="com.intellij.openapi.vcs.update.UpdateOrStatusOptionsDialogupdate-v2" timestamp="1621773490794">
<screen x="0" y="27" width="1920" height="1053" />
</state>
<state x="741" y="455" width="438" height="177" key="com.intellij.openapi.vcs.update.UpdateOrStatusOptionsDialogupdate-v2/1920.0.1920.1080/0.27.1920.1053@0.27.1920.1053" timestamp="1621773490794" />
<state x="1248" y="245" key="run.anything.popup" timestamp="1621713204008">
<screen x="0" y="27" width="3840" height="1053" />
<state x="651" y="279" width="618" height="522" key="find.popup" timestamp="1623164695220">
<screen x="0" y="27" width="1920" height="1053" />
</state>
<state x="651" y="279" width="618" height="522" key="find.popup/1920.0.1920.1080/0.27.1920.1053@0.27.1920.1053" timestamp="1623164695220" />
<state x="624" y="245" key="run.anything.popup" timestamp="1623150034896">
<screen x="0" y="27" width="1920" height="1053" />
</state>
<state x="1248" y="245" key="run.anything.popup/0.27.3840.1053@0.27.3840.1053" timestamp="1621713204008" />
<state x="624" y="245" key="run.anything.popup/1920.0.1920.1080/0.27.1920.1053@0.27.1920.1053" timestamp="1621340767679" />
<state x="624" y="245" key="run.anything.popup/1920.0.1920.1080/0.27.1920.1053@0.27.1920.1053" timestamp="1623150034896" />
<state x="755" y="405" width="400" height="284" key="scopes" timestamp="1621932851405">
<screen x="0" y="27" width="1920" height="1053" />
</state>
<state x="755" y="405" width="400" height="284" key="scopes/1920.0.1920.1080/0.27.1920.1053@0.27.1920.1053" timestamp="1621932851405" />
<state x="623" y="239" width="672" height="678" key="search.everywhere.popup" timestamp="1621363038727">
<state x="623" y="239" width="672" height="678" key="search.everywhere.popup" timestamp="1623095042292">
<screen x="0" y="27" width="1920" height="1053" />
</state>
<state x="623" y="239" width="672" height="678" key="search.everywhere.popup/1920.0.1920.1080/0.27.1920.1053@0.27.1920.1053" timestamp="1621363038727" />
<state x="623" y="239" width="672" height="678" key="search.everywhere.popup/1920.0.1920.1080/0.27.1920.1053@0.27.1920.1053" timestamp="1623095042292" />
</component>
</project>

34
package-lock.json generated
View File

@@ -212,6 +212,14 @@
"picomatch": "^2.0.4"
}
},
"as-bind": {
"version": "0.7.1",
"resolved": "https://registry.npmjs.org/as-bind/-/as-bind-0.7.1.tgz",
"integrity": "sha512-x/tfZZcyObwvAohhVYaKqLSvroMHqop3l9gkUO5JM0bBEdhI3BWXjkG3DZIuWj0YFzhQ8OiWG3FCvQQq/5yB3A==",
"requires": {
"visitor-as": "^0.5.0"
}
},
"balanced-match": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
@@ -246,8 +254,7 @@
"buffer-from": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
"integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
"dev": true
"integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A=="
},
"builtin-modules": {
"version": "3.2.0",
@@ -545,6 +552,11 @@
"resolved": "https://registry.npmjs.org/local-access/-/local-access-1.1.0.tgz",
"integrity": "sha512-XfegD5pyTAfb+GY6chk283Ox5z8WexG56OvM06RWLpAc/UHozO8X6xAxEkIitZOtsSMM1Yr3DkHgW5W+onLhCw=="
},
"lodash.clonedeep": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
"integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8="
},
"magic-string": {
"version": "0.25.7",
"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz",
@@ -820,7 +832,6 @@
"version": "0.5.19",
"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz",
"integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==",
"dev": true,
"requires": {
"buffer-from": "^1.0.0",
"source-map": "^0.6.0"
@@ -829,8 +840,7 @@
"source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"dev": true
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
}
}
},
@@ -927,6 +937,11 @@
"resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz",
"integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g=="
},
"ts-mixer": {
"version": "5.4.1",
"resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-5.4.1.tgz",
"integrity": "sha512-Zo9HgPCtNouDgJ+LGtrzVOjSg8+7WGQktIKLwAfaNrlOK1mWGlz1ejsAF/YqUEqAGjUTeB5fEg8gH9Aui6w9xA=="
},
"tslib": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz",
@@ -938,6 +953,15 @@
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.0-dev.20210525.tgz",
"integrity": "sha512-hpPEilDaUKKUgh7UmsjDzf3+8dSVICYRHxrXLFOhhKe5gHktNYVFGYdRhUApIPbWhAbwJxIssM3X89QW/+y/+A=="
},
"visitor-as": {
"version": "0.5.0",
"resolved": "https://registry.npmjs.org/visitor-as/-/visitor-as-0.5.0.tgz",
"integrity": "sha512-U2P13pa7BAnfj6IEbP4feS1Rci6NT4GlDcwpqkk90u7LGalc5jH9aMuWnxTC8RJJ92iZzDQ8Lea5/OnLDsgzlw==",
"requires": {
"lodash.clonedeep": "^4.5.0",
"ts-mixer": "^5.1.0"
}
},
"wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",

View File

@@ -27,7 +27,9 @@
"tslib": "^2.0.0"
},
"dependencies": {
"as-bind": "^0.7.1",
"sirv-cli": "^1.0.0",
"source-map-support": "^0.5.19",
"three": "^0.128.0",
"typescript": "^4.4.0-dev.20210525"
}

View File

@@ -63,3 +63,10 @@ button:not(:disabled):active {
button:focus {
border-color: #666;
}
::-webkit-scrollbar {
background-color: transparent;
}
::-webkit-scrollbar-thumb {
background-color: rgba(0,0,0,0.25);
}

View File

@@ -6,11 +6,11 @@
<title>Svelte app</title>
<link rel='icon' type='image/png' href='/favicon.png'>
<link rel='stylesheet' href='/global.css'>
<link rel='stylesheet' href='/build/bundle.css'>
<link rel='icon' type='image/png' href='./favicon.png'>
<link rel='stylesheet' href='./global.css'>
<link rel='stylesheet' href='./build/bundle.css'>
<script defer src='/build/bundle.js'></script>
<script defer src='./build/bundle.js'></script>
</head>
<body>

View File

@@ -1,12 +0,0 @@
# Blender MTL File: 'None'
# Material Count: 1
newmtl None
Ns 500.000001
Ka 1.000000 1.000000 1.000000
Kd 0.800000 0.800000 0.800000
Ks 0.800000 0.800000 0.800000
Ke 0.000000 0.000000 0.000000
Ni 1.450000
d 1.000000
illum 2

View File

@@ -1,10 +0,0 @@
# Blender MTL File: 'None'
# Material Count: 1
newmtl None
Ns 500
Ka 0.8 0.8 0.8
Kd 0.8 0.8 0.8
Ks 0.8 0.8 0.8
d 1
illum 2

View File

@@ -1,287 +0,0 @@
# Blender v2.82 (sub 7) OBJ File: ''
# www.blender.org
mtllib 000001.mtl
o Cube_Cube.001
v -0.447727 0.391799 0.476834
v -0.391799 0.391799 0.500000
v -0.391799 0.447727 0.476834
v -0.449707 0.449707 0.449707
v -0.391799 0.476834 0.447727
v -0.391799 0.500000 0.391799
v -0.447727 0.476834 0.391799
v -0.476834 0.391799 0.447727
v -0.476834 0.447727 0.391799
v -0.500000 0.391799 0.391799
v -0.447727 0.476834 -0.391799
v -0.391799 0.500000 -0.391799
v -0.391799 0.476834 -0.447727
v -0.449707 0.449707 -0.449707
v -0.391799 0.447727 -0.476834
v -0.391799 0.391799 -0.500000
v -0.447727 0.391799 -0.476834
v -0.476834 0.447727 -0.391799
v -0.476834 0.391799 -0.447727
v -0.500000 0.391799 -0.391799
v 0.447727 0.476834 0.391799
v 0.391799 0.500000 0.391799
v 0.391799 0.476834 0.447727
v 0.449707 0.449707 0.449707
v 0.391799 0.447727 0.476834
v 0.391799 0.391799 0.500000
v 0.447727 0.391799 0.476834
v 0.476834 0.447727 0.391799
v 0.476834 0.391799 0.447727
v 0.500000 0.391799 0.391799
v 0.391799 0.476834 -0.447727
v 0.391799 0.500000 -0.391799
v 0.447727 0.476834 -0.391799
v 0.449707 0.449707 -0.449707
v 0.476834 0.447727 -0.391799
v 0.500000 0.391799 -0.391799
v 0.476834 0.391799 -0.447727
v 0.391799 0.447727 -0.476834
v 0.447727 0.391799 -0.476834
v 0.391799 0.391799 -0.500000
v -0.447727 -0.504219 0.476834
v -0.391799 -0.504219 0.500000
v -0.476834 -0.504219 0.447727
v -0.500000 -0.504219 0.391799
v -0.391799 -0.504219 -0.500000
v -0.447727 -0.504219 -0.476834
v -0.476834 -0.504219 -0.447727
v -0.500000 -0.504219 -0.391799
v 0.391799 -0.504219 0.500000
v 0.447727 -0.504219 0.476834
v 0.476834 -0.504219 0.447727
v 0.500000 -0.504219 0.391799
v 0.500000 -0.504219 -0.391799
v 0.476834 -0.504219 -0.447727
v 0.447727 -0.504219 -0.476834
v 0.391799 -0.504219 -0.500000
vt 0.632277 0.527050
vt 0.632277 0.722950
vt 0.617723 0.722950
vt 0.617723 0.527050
vt 0.652050 0.736932
vt 0.847950 0.736932
vt 0.847950 0.744209
vt 0.652050 0.744209
vt 0.847950 0.513068
vt 0.652050 0.513068
vt 0.652050 0.505791
vt 0.847950 0.505791
vt 0.652050 0.527050
vt 0.847950 0.527050
vt 0.847950 0.722950
vt 0.652050 0.722950
vt 0.861932 0.722950
vt 0.861932 0.527050
vt 0.869209 0.527050
vt 0.869208 0.722950
vt 0.597950 0.986932
vt 0.597950 0.981140
vt 0.606140 0.981140
vt 0.606140 0.991171
vt 0.847950 0.731140
vt 0.856140 0.731140
vt 0.856140 0.741171
vt 0.597950 0.994209
vt 0.606140 0.989969
vt 0.606140 1.000000
vt 0.597950 1.000000
vt 0.862828 0.512172
vt 0.847950 0.500000
vt 0.856140 0.500000
vt 0.856140 0.510031
vt 0.864969 0.518860
vt 0.875000 0.518860
vt 0.875000 0.527050
vt 0.643860 0.722950
vt 0.643860 0.731140
vt 0.623797 0.731140
vt 0.652050 0.750000
vt 0.643860 0.750000
vt 0.643860 0.739969
vt 0.626203 0.731140
vt 0.606140 0.731140
vt 0.606140 0.722950
vt 0.652050 0.518860
vt 0.643860 0.518860
vt 0.643860 0.508829
vt 0.606140 0.527050
vt 0.606140 0.518860
vt 0.626203 0.518860
vt 0.643860 0.510031
vt 0.643860 0.500000
vt 0.652050 0.500000
vt 0.612828 0.986625
vt 0.856140 0.739969
vt 0.866171 0.731140
vt 0.861625 0.512172
vt 0.597950 0.257277
vt 0.597950 0.242723
vt 0.606140 0.248797
vt 0.637172 0.737828
vt 0.597950 0.757277
vt 0.597950 0.742723
vt 0.606140 0.748798
vt 0.637172 0.513375
vt 0.623797 0.518860
vt 0.597950 0.507277
vt 0.597950 0.492723
vt 0.606140 0.498798
vt 0.597950 0.222950
vt 0.597950 0.027050
vt 0.606140 0.027050
vt 0.606140 0.222950
vt 0.597950 0.472950
vt 0.597950 0.277050
vt 0.606140 0.277050
vt 0.606140 0.472950
vt 0.597950 0.722950
vt 0.597950 0.527050
vt 0.597950 0.972950
vt 0.597950 0.777050
vt 0.606140 0.777050
vt 0.606140 0.972950
vt 0.643860 0.500000
vt 0.652050 0.500000
vt 0.597950 0.757277
vt 0.597950 0.742723
vt 0.597950 0.994209
vt 0.597950 0.986932
vt 0.597950 1.000000
vt 0.597950 0.222950
vt 0.597950 0.027050
vt 0.597950 0.722950
vt 0.597950 0.527050
vt 0.847950 0.500000
vt 0.856140 0.500000
vt 0.652050 0.750000
vt 0.643860 0.750000
vt 0.597950 0.981140
vt 0.606140 0.527050
vt 0.606140 0.518860
vt 0.597950 0.257277
vt 0.597950 0.242723
vt 0.875000 0.518860
vt 0.875000 0.527050
vt 0.597950 0.507277
vt 0.597950 0.492723
vt 0.597950 0.472950
vt 0.597950 0.277050
vt 0.606140 0.731140
vt 0.606140 0.722950
vt 0.597950 0.972950
vt 0.597950 0.777050
vn 0.5505 0.8168 -0.1727
vn 0.5518 0.8162 0.1716
vn 0.8162 0.5518 0.1714
vn 0.8162 0.5518 -0.1716
vn 0.1714 0.8162 0.5518
vn -0.1715 0.8171 0.5503
vn -0.1714 0.5518 0.8162
vn 0.1716 0.5518 0.8162
vn -0.1714 0.8162 -0.5518
vn 0.1716 0.8162 -0.5518
vn 0.1714 0.5518 -0.8162
vn -0.1716 0.5518 -0.8162
vn 0.1955 0.9610 -0.1955
vn -0.1955 0.9610 -0.1955
vn -0.1955 0.9610 0.1955
vn 0.1939 0.9617 0.1939
vn -0.5518 0.8162 0.1714
vn -0.5518 0.8162 -0.1716
vn -0.8162 0.5518 -0.1714
vn -0.8162 0.5518 0.1716
vn -0.5518 0.1714 0.8162
vn -0.1955 0.1955 0.9610
vn -0.5795 0.5795 0.5730
vn -0.8171 0.1716 0.5503
vn -0.9610 0.1955 0.1955
vn -0.5774 0.5774 -0.5774
vn -0.1955 0.1955 -0.9610
vn -0.5518 0.1714 -0.8162
vn -0.8162 0.1714 -0.5518
vn -0.9610 0.1955 -0.1955
vn 0.5774 0.5774 0.5774
vn 0.1955 0.1955 0.9610
vn 0.5518 0.1714 0.8162
vn 0.8162 0.1714 0.5518
vn 0.9610 0.1955 0.1955
vn 0.5739 0.5791 -0.5791
vn 0.9610 0.1955 -0.1955
vn 0.8156 0.1713 -0.5527
vn 0.5518 0.1714 -0.8162
vn 0.1955 0.1955 -0.9610
vn 0.5556 0.0000 -0.8315
vn 0.1951 0.0000 -0.9808
vn 0.5556 0.0000 0.8315
vn 0.8315 0.0000 0.5556
vn -0.8315 0.0000 0.5556
vn -0.5556 0.0000 0.8315
vn -0.9808 0.0000 0.1951
vn -0.9808 0.0000 -0.1951
vn 0.9808 0.0000 0.1951
vn 0.9808 0.0000 -0.1951
vn -0.1951 0.0000 -0.9808
vn -0.5556 0.0000 -0.8315
vn 0.1951 0.0000 0.9808
vn -0.1951 0.0000 0.9808
vn 0.8315 0.0000 -0.5556
vn -0.8315 0.0000 -0.5556
usemtl None
s 1
f 33/1/1 21/2/2 28/3/3 35/4/4
f 23/5/5 5/6/6 3/7/7 25/8/8
f 13/9/9 31/10/10 38/11/11 15/12/12
f 32/13/13 12/14/14 6/15/15 22/16/16
f 7/17/17 11/18/18 18/19/19 9/20/20
f 1/21/21 2/22/22 3/23/7 4/24/23
f 5/6/6 6/25/15 7/26/17 4/27/23
f 8/28/24 4/29/23 9/30/20 10/31/25
f 11/18/18 12/14/14 13/9/9 14/32/26
f 15/12/12 16/33/27 17/34/28 14/35/26
f 18/19/19 14/36/26 19/37/29 20/38/30
f 21/2/2 22/39/16 23/40/5 24/41/31
f 25/8/8 26/42/32 27/43/33 24/44/31
f 28/3/3 24/45/31 29/46/34 30/47/35
f 31/10/10 32/48/13 33/49/1 34/50/36
f 35/4/4 36/51/37 37/52/38 34/53/36
f 38/11/11 34/54/36 39/55/39 40/56/40
f 8/28/24 1/21/21 4/57/23
f 3/7/7 5/6/6 4/58/23
f 7/17/17 9/20/20 4/59/23
f 18/19/19 11/18/18 14/60/26
f 13/9/9 15/12/12 14/32/26
f 17/61/28 19/62/29 14/63/26
f 28/3/3 21/2/2 24/45/31
f 23/5/5 25/8/8 24/64/31
f 27/65/33 29/66/34 24/67/31
f 38/11/11 31/10/10 34/68/36
f 33/1/1 35/4/4 34/69/36
f 37/70/38 39/71/39 34/72/36
f 6/15/15 12/14/14 11/18/18 7/17/17
f 20/73/30 10/74/25 9/75/20 18/76/19
f 12/14/14 32/13/13 31/10/10 13/9/9
f 40/77/40 16/78/27 15/79/12 38/80/11
f 32/13/13 22/16/16 21/2/2 33/1/1
f 30/81/35 36/82/37 35/4/4 28/3/3
f 22/16/16 6/15/15 5/6/6 23/5/5
f 2/83/22 26/84/32 25/85/8 3/86/7
f 40/56/40 39/55/39 55/87/41 56/88/42
f 29/66/34 27/65/33 50/89/43 51/90/44
f 1/21/21 8/28/24 43/91/45 41/92/46
f 8/28/24 10/31/25 44/93/47 43/91/45
f 10/74/25 20/73/30 48/94/48 44/95/47
f 36/82/37 30/81/35 52/96/49 53/97/50
f 17/34/28 16/33/27 45/98/51 46/99/52
f 27/43/33 26/42/32 49/100/53 50/101/43
f 2/22/22 1/21/21 41/92/46 42/102/54
f 37/52/38 36/51/37 53/103/50 54/104/55
f 19/62/29 17/61/28 46/105/52 47/106/56
f 20/38/30 19/37/29 47/107/56 48/108/48
f 39/71/39 37/70/38 54/109/55 55/110/41
f 16/78/27 40/77/40 56/111/42 45/112/51
f 30/47/35 29/46/34 51/113/44 52/114/49
f 26/84/32 2/83/22 42/115/54 49/116/53

View File

@@ -1,12 +0,0 @@
# Blender MTL File: 'None'
# Material Count: 1
newmtl None
Ns 500.000001
Ka 1.000000 1.000000 1.000000
Kd 0.800000 0.800000 0.800000
Ks 0.800000 0.800000 0.800000
Ke 0.000000 0.000000 0.000000
Ni 1.450000
d 1.000000
illum 2

View File

@@ -1,12 +0,0 @@
# Blender MTL File: 'None'
# Material Count: 1
newmtl None
Ns 500.000001
Ka 1.000000 1.000000 1.000000
Kd 0.800000 0.800000 0.800000
Ks 0.800000 0.800000 0.800000
Ke 0.000000 0.000000 0.000000
Ni 1.450000
d 1.000000
illum 2

View File

@@ -1,299 +0,0 @@
# Blender v2.82 (sub 7) OBJ File: ''
# www.blender.org
mtllib xy.mtl
o Cube_Cube.001
v 0.499961 0.500000 -0.499961
v 0.499961 -0.500000 -0.499961
v 0.499961 0.500000 0.399961
v 0.499961 0.399961 0.500000
v 0.499961 0.492385 0.438244
v 0.499961 0.470699 0.470699
v 0.499961 0.438244 0.492385
v 0.499961 -0.399961 0.500000
v 0.499961 -0.500000 0.399961
v 0.499961 -0.438244 0.492385
v 0.499961 -0.470699 0.470699
v 0.499961 -0.492385 0.438244
v -0.500000 0.399961 -0.499961
v -0.399961 0.500000 -0.499961
v -0.492385 0.438244 -0.499961
v -0.470699 0.470699 -0.499961
v -0.438244 0.492385 -0.499961
v -0.399961 -0.500000 -0.499961
v -0.500000 -0.399961 -0.499961
v -0.438244 -0.492385 -0.499961
v -0.470699 -0.470699 -0.499961
v -0.492385 -0.438244 -0.499961
v -0.500000 0.399961 0.399961
v -0.399961 0.399961 0.500000
v -0.399961 0.500000 0.399961
v -0.492385 0.399961 0.438244
v -0.470699 0.399961 0.470699
v -0.492385 0.438244 0.399961
v -0.483194 0.439203 0.439203
v -0.465612 0.437212 0.465612
v -0.457718 0.457718 0.457718
v -0.399961 0.438244 0.492385
v -0.399961 0.470699 0.470699
v -0.438244 0.399961 0.492385
v -0.439203 0.439203 0.483194
v -0.437212 0.465612 0.465612
v -0.438244 0.492385 0.399961
v -0.470699 0.470699 0.399961
v -0.399961 0.492385 0.438244
v -0.439203 0.483194 0.439203
v -0.465612 0.465612 0.437212
v -0.399961 -0.399961 0.500000
v -0.500000 -0.399961 0.399961
v -0.399961 -0.500000 0.399961
v -0.438244 -0.399961 0.492385
v -0.470699 -0.399961 0.470699
v -0.399961 -0.438244 0.492385
v -0.439203 -0.439203 0.483194
v -0.465612 -0.437212 0.465612
v -0.457718 -0.457718 0.457718
v -0.492385 -0.438244 0.399961
v -0.470699 -0.470699 0.399961
v -0.492385 -0.399961 0.438244
v -0.483194 -0.439203 0.439203
v -0.465612 -0.465612 0.437212
v -0.399961 -0.492385 0.438244
v -0.399961 -0.470699 0.470699
v -0.438244 -0.492385 0.399961
v -0.439203 -0.483194 0.439203
v -0.437212 -0.465612 0.465612
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.150010 0.525010
vt 0.349990 0.525010
vt 0.349990 0.724990
vt 0.150010 0.724990
vt 0.400010 0.775010
vt 0.599990 0.775010
vt 0.599990 0.974990
vt 0.400010 0.974990
vt 0.400010 0.025010
vt 0.599990 0.025010
vt 0.599990 0.224990
vt 0.400010 0.224990
vt 0.599990 0.765439
vt 0.609801 0.765199
vt 0.609561 0.775010
vt 0.599990 0.750000
vt 0.609303 0.750000
vt 0.625000 0.765697
vt 0.625000 0.775010
vt 0.614430 0.750000
vt 0.359561 0.724990
vt 0.359801 0.734801
vt 0.349990 0.734561
vt 0.375000 0.724990
vt 0.375000 0.734303
vt 0.359303 0.750000
vt 0.349990 0.750000
vt 0.375000 0.739430
vt 0.599990 0.724990
vt 0.609561 0.724990
vt 0.609801 0.734801
vt 0.599990 0.734561
vt 0.625000 0.724990
vt 0.625000 0.734303
vt 0.609303 0.750000
vt 0.599990 0.750000
vt 0.625000 0.739430
vt 0.150010 0.734561
vt 0.140199 0.734801
vt 0.140439 0.724990
vt 0.150010 0.750000
vt 0.140697 0.750000
vt 0.125000 0.734303
vt 0.125000 0.724990
vt 0.135570 0.750000
vt 0.390439 0.775010
vt 0.390199 0.765199
vt 0.400010 0.765439
vt 0.375000 0.775010
vt 0.375000 0.765697
vt 0.390697 0.750000
vt 0.400010 0.750000
vt 0.375000 0.760570
vt 0.400010 0.234561
vt 0.390199 0.234801
vt 0.390439 0.224990
vt 0.400010 0.250000
vt 0.390697 0.250000
vt 0.375000 0.234303
vt 0.375000 0.224990
vt 0.385570 0.250000
vt 0.599990 0.234561
vt 0.599990 0.250000
vt 0.125000 0.525010
vt 0.140439 0.525010
vt 0.599990 0.525010
vt 0.609561 0.525010
vt 0.625000 0.525010
vt 0.625000 0.974990
vt 0.609561 0.974990
vt 0.390439 0.025010
vt 0.375000 0.025010
vt 0.375000 0.974990
vt 0.390439 0.974990
vt 0.400010 0.724990
vt 0.400010 0.734561
vt 0.400010 0.750000
vt 0.375000 0.525010
vt 0.359561 0.525010
vt 0.400010 0.525010
vn 0.0000 0.0000 -1.0000
vn 1.0000 -0.0000 0.0000
vn 0.0000 -0.0980 0.9952
vn 0.0000 0.0980 0.9952
vn -0.1004 0.1004 0.9899
vn -0.1004 -0.1004 0.9899
vn -0.9899 -0.1004 0.1004
vn -0.9899 0.1004 0.1004
vn -0.9952 0.0980 0.0000
vn -0.9952 -0.0980 -0.0000
vn -0.0980 -0.9952 -0.0000
vn 0.0000 -1.0000 -0.0000
vn 0.0000 -0.9952 0.0980
vn -0.1004 -0.9899 0.1004
vn -0.9201 0.0981 0.3792
vn -0.8545 0.3673 0.3673
vn -0.9201 0.3792 0.0981
vn -0.7041 0.0919 0.7041
vn -0.6663 0.3347 0.6663
vn -0.6663 0.6663 0.3347
vn -0.7041 0.7041 0.0919
vn -0.5774 0.5774 0.5773
vn -0.0981 0.3792 0.9201
vn -0.3673 0.3673 0.8545
vn -0.3792 0.0981 0.9201
vn -0.0919 0.7041 0.7041
vn -0.3347 0.6663 0.6663
vn -0.1004 0.9899 0.1004
vn -0.3792 0.9201 0.0981
vn -0.3673 0.8545 0.3673
vn -0.0981 0.9201 0.3792
vn -0.3792 -0.0981 0.9201
vn -0.3673 -0.3673 0.8545
vn -0.0981 -0.3792 0.9201
vn -0.7041 -0.0919 0.7041
vn -0.6663 -0.3347 0.6663
vn -0.3347 -0.6663 0.6663
vn -0.0919 -0.7041 0.7041
vn -0.5774 -0.5774 0.5773
vn -0.9201 -0.3792 0.0981
vn -0.8545 -0.3673 0.3673
vn -0.9201 -0.0981 0.3792
vn -0.7041 -0.7041 0.0919
vn -0.6663 -0.6663 0.3347
vn -0.0981 -0.9201 0.3792
vn -0.3673 -0.8545 0.3673
vn -0.3792 -0.9201 0.0981
vn 0.0000 -0.9239 0.3827
vn 0.0000 -0.7071 0.7071
vn 0.0000 -0.3827 0.9239
vn -0.0980 0.9952 0.0000
vn -0.3827 0.9239 0.0000
vn -0.7071 0.7071 0.0000
vn -0.9239 0.3827 0.0000
vn -0.3827 -0.9239 0.0000
vn -0.7071 -0.7071 0.0000
vn -0.9239 -0.3827 -0.0000
vn 0.0000 0.9952 0.0980
vn 0.0000 0.9239 0.3827
vn 0.0000 0.7071 0.7071
vn 0.0000 0.3827 0.9239
vn 0.0000 1.0000 0.0000
usemtl None
s off
f 2/1/1 18/2/1 14/3/1
f 14/3/1 13/4/1 16/5/1
f 13/4/1 15/6/1 16/5/1
f 17/7/1 14/3/1 16/5/1
f 22/8/1 19/9/1 21/10/1
f 19/9/1 18/2/1 21/10/1
f 18/2/1 20/11/1 21/10/1
f 1/12/1 2/1/1 14/3/1
f 13/4/1 14/3/1 19/9/1
f 14/3/1 18/2/1 19/9/1
f 3/13/2 5/14/2 6/15/2
f 9/16/2 8/17/2 11/18/2
f 3/13/2 2/1/2 1/12/2
f 3/13/2 9/16/2 2/1/2
f 9/16/2 4/19/2 8/17/2
f 4/19/2 3/13/2 6/15/2
f 7/20/2 4/19/2 6/15/2
f 12/21/2 9/16/2 11/18/2
f 4/19/2 9/16/2 3/13/2
f 10/22/2 11/18/2 8/17/2
s 1
f 8/23/3 4/24/4 24/25/5 42/26/6
f 43/27/7 23/28/8 13/29/9 19/30/10
f 18/31/11 2/32/12 9/33/13 44/34/14
f 23/28/8 26/35/15 29/36/16 28/37/17
f 26/35/15 27/38/18 30/39/19 29/36/16
f 28/37/17 29/36/16 41/40/20 38/41/21
f 29/36/16 30/39/19 31/42/22 41/40/20
f 24/25/5 32/43/23 35/44/24 34/45/25
f 32/43/23 33/46/26 36/47/27 35/44/24
f 34/45/25 35/44/24 30/48/19 27/49/18
f 35/44/24 36/47/27 31/50/22 30/48/19
f 25/51/28 37/52/29 40/53/30 39/54/31
f 37/52/29 38/55/21 41/56/20 40/53/30
f 39/54/31 40/53/30 36/57/27 33/58/26
f 40/53/30 41/56/20 31/59/22 36/57/27
f 42/26/6 45/60/32 48/61/33 47/62/34
f 45/60/32 46/63/35 49/64/36 48/61/33
f 47/62/34 48/61/33 60/65/37 57/66/38
f 48/61/33 49/64/36 50/67/39 60/65/37
f 43/27/7 51/68/40 54/69/41 53/70/42
f 51/68/40 52/71/43 55/72/44 54/69/41
f 53/70/42 54/69/41 49/73/36 46/74/35
f 54/69/41 55/72/44 50/75/39 49/73/36
f 44/34/14 56/76/45 59/77/46 58/78/47
f 56/76/45 57/79/38 60/80/37 59/77/46
f 58/78/47 59/77/46 55/81/44 52/82/43
f 59/77/46 60/80/37 50/83/39 55/81/44
f 44/34/14 9/33/13 12/84/48 56/76/45
f 56/76/45 12/84/48 11/85/49 57/79/38
f 57/66/38 11/86/49 10/87/50 47/62/34
f 47/62/34 10/87/50 8/23/3 42/26/6
f 25/51/28 14/88/51 17/89/52 37/52/29
f 37/52/29 17/89/52 16/90/53 38/55/21
f 38/41/21 16/91/53 15/92/54 28/37/17
f 28/37/17 15/92/54 13/29/9 23/28/8
f 18/31/11 44/34/14 58/78/47 20/93/55
f 20/93/55 58/78/47 52/82/43 21/94/56
f 21/95/56 52/71/43 51/68/40 22/96/57
f 22/96/57 51/68/40 43/27/7 19/30/10
f 3/97/58 25/51/28 39/54/31 5/98/59
f 5/98/59 39/54/31 33/58/26 6/99/60
f 6/100/60 33/46/26 32/43/23 7/101/61
f 7/101/61 32/43/23 24/25/5 4/24/4
f 42/26/6 24/25/5 34/45/25 45/60/32
f 45/60/32 34/45/25 27/49/18 46/63/35
f 46/74/35 27/38/18 26/35/15 53/70/42
f 53/70/42 26/35/15 23/28/8 43/27/7
f 1/102/62 14/88/51 25/51/28 3/97/58

View File

@@ -1,12 +0,0 @@
# Blender MTL File: 'None'
# Material Count: 1
newmtl None
Ns 500.000001
Ka 1.000000 1.000000 1.000000
Kd 0.800000 0.800000 0.800000
Ks 0.800000 0.800000 0.800000
Ke 0.000000 0.000000 0.000000
Ni 1.450000
d 1.000000
illum 2

View File

@@ -1,131 +0,0 @@
# Blender v2.82 (sub 7) OBJ File: ''
# www.blender.org
mtllib xymx.mtl
o Cube_Cube.001
v 0.499961 0.500000 -0.499961
v 0.499961 -0.500000 -0.499961
v 0.499961 0.500000 0.399961
v 0.499961 0.399961 0.500000
v 0.499961 0.492385 0.438244
v 0.499961 0.470699 0.470699
v 0.499961 0.438244 0.492385
v 0.499961 -0.399961 0.500000
v 0.499961 -0.500000 0.399961
v 0.499961 -0.438244 0.492385
v 0.499961 -0.470699 0.470699
v 0.499961 -0.492385 0.438244
v -0.499961 0.500000 -0.499961
v -0.499961 -0.500000 -0.499961
v -0.499961 0.399961 0.500000
v -0.499961 0.500000 0.399961
v -0.499961 0.438244 0.492385
v -0.499961 0.470699 0.470699
v -0.499961 0.492385 0.438244
v -0.499961 -0.399961 0.500000
v -0.499961 -0.500000 0.399961
v -0.499961 -0.438244 0.492385
v -0.499961 -0.492385 0.438244
v -0.499961 -0.470699 0.470699
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.150010 0.525010
vt 0.349990 0.525010
vt 0.349990 0.724990
vt 0.150010 0.724990
vt 0.400010 0.025010
vt 0.599990 0.025010
vt 0.599990 0.224990
vt 0.400010 0.224990
vt 0.599990 0.234561
vt 0.400010 0.234561
vt 0.599990 0.250000
vt 0.400010 0.250000
vt 0.125000 0.724990
vt 0.125000 0.525010
vt 0.140439 0.525010
vt 0.140439 0.724990
vt 0.400010 0.724990
vt 0.599990 0.724990
vt 0.599990 0.734561
vt 0.400010 0.734561
vt 0.599990 0.750000
vt 0.400010 0.750000
vt 0.375000 0.525010
vt 0.375000 0.724990
vt 0.359561 0.724990
vt 0.359561 0.525010
vt 0.400010 0.525010
vt 0.599990 0.525010
vn 0.0000 0.0000 -1.0000
vn 1.0000 -0.0000 0.0000
vn -1.0000 0.0000 0.0000
vn 0.0000 -0.0980 0.9952
vn 0.0000 0.0980 0.9952
vn 0.0000 -1.0000 -0.0000
vn 0.0000 -0.9952 0.0980
vn 0.0000 -0.9239 0.3827
vn 0.0000 -0.7071 0.7071
vn 0.0000 -0.3827 0.9239
vn 0.0000 0.9952 0.0980
vn 0.0000 0.9239 0.3827
vn 0.0000 0.7071 0.7071
vn 0.0000 0.3827 0.9239
vn 0.0000 1.0000 0.0000
usemtl None
s off
f 2/1/1 14/2/1 13/3/1
f 1/4/1 2/1/1 13/3/1
f 3/5/2 5/6/2 6/7/2
f 9/8/2 8/9/2 11/10/2
f 3/5/2 2/1/2 1/4/2
f 3/5/2 9/8/2 2/1/2
f 9/8/2 4/11/2 8/9/2
f 4/11/2 3/5/2 6/7/2
f 7/12/2 4/11/2 6/7/2
f 12/13/2 9/8/2 11/10/2
f 4/11/2 9/8/2 3/5/2
f 10/14/2 11/10/2 8/9/2
f 16/15/3 13/3/3 14/2/3
f 16/15/3 14/2/3 21/16/3
f 21/16/3 20/17/3 16/15/3
f 20/17/3 15/18/3 16/15/3
f 21/16/3 23/19/3 24/20/3
f 19/21/3 16/15/3 18/22/3
f 20/17/3 21/16/3 24/20/3
f 15/18/3 17/23/3 18/22/3
f 16/15/3 15/18/3 18/22/3
f 24/20/3 22/24/3 20/17/3
s 1
f 8/25/4 4/26/5 15/27/5 20/28/4
f 14/29/6 2/30/6 9/31/7 21/32/7
f 21/32/7 9/31/7 12/33/8 23/34/8
f 23/34/8 12/33/8 11/35/9 24/36/9
f 24/37/9 11/38/9 10/39/10 22/40/10
f 22/40/10 10/39/10 8/25/4 20/28/4
f 3/41/11 16/42/11 19/43/12 5/44/12
f 5/44/12 19/43/12 18/45/13 6/46/13
f 6/47/13 18/48/13 17/49/14 7/50/14
f 7/50/14 17/49/14 15/27/5 4/26/5
f 1/51/15 13/52/15 16/42/11 3/41/11

View File

@@ -1,12 +0,0 @@
# Blender MTL File: 'None'
# Material Count: 1
newmtl None
Ns 500.000001
Ka 1.000000 1.000000 1.000000
Kd 0.800000 0.800000 0.800000
Ks 0.800000 0.800000 0.800000
Ke 0.000000 0.000000 0.000000
Ni 1.450000
d 1.000000
illum 2

View File

@@ -1,12 +0,0 @@
# Blender MTL File: 'None'
# Material Count: 1
newmtl None
Ns 500.000001
Ka 1.000000 1.000000 1.000000
Kd 0.800000 0.800000 0.800000
Ks 0.800000 0.800000 0.800000
Ke 0.000000 0.000000 0.000000
Ni 1.450000
d 1.000000
illum 2

View File

@@ -1,197 +0,0 @@
# Blender v2.82 (sub 7) OBJ File: ''
# www.blender.org
mtllib xyz.mtl
o Cube_Cube.001
v 0.499961 0.500000 -0.499961
v 0.499961 -0.500000 -0.499961
v 0.499961 0.499961 0.500000
v 0.499961 -0.399961 0.500000
v 0.499961 -0.500000 0.399961
v 0.499961 -0.438244 0.492385
v 0.499961 -0.470699 0.470699
v 0.499961 -0.492385 0.438244
v -0.500000 0.499961 -0.499961
v -0.399961 -0.500000 -0.499961
v -0.500000 -0.399961 -0.499961
v -0.438244 -0.492385 -0.499961
v -0.470699 -0.470699 -0.499961
v -0.492385 -0.438244 -0.499961
v -0.500000 0.499961 0.399961
v -0.399961 0.499961 0.500000
v -0.492385 0.499961 0.438244
v -0.470699 0.499961 0.470699
v -0.438244 0.499961 0.492385
v -0.399961 -0.399961 0.500000
v -0.500000 -0.399961 0.399961
v -0.399961 -0.500000 0.399961
v -0.438244 -0.399961 0.492385
v -0.470699 -0.399961 0.470699
v -0.399961 -0.438244 0.492385
v -0.439203 -0.439203 0.483194
v -0.465612 -0.437212 0.465612
v -0.457718 -0.457718 0.457718
v -0.492385 -0.438244 0.399961
v -0.470699 -0.470699 0.399961
v -0.492385 -0.399961 0.438244
v -0.483194 -0.439203 0.439203
v -0.465612 -0.465612 0.437212
v -0.399961 -0.492385 0.438244
v -0.399961 -0.470699 0.470699
v -0.438244 -0.492385 0.399961
v -0.439203 -0.483194 0.439203
v -0.437212 -0.465612 0.465612
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.150010 0.525010
vt 0.349990 0.525010
vt 0.349990 0.724990
vt 0.150010 0.724990
vt 0.400010 0.775010
vt 0.599990 0.775010
vt 0.599990 0.974990
vt 0.400010 0.974990
vt 0.400010 0.025010
vt 0.599990 0.025010
vt 0.599990 0.224990
vt 0.400010 0.224990
vt 0.150010 0.734561
vt 0.140199 0.734801
vt 0.140439 0.724990
vt 0.150010 0.750000
vt 0.140697 0.750000
vt 0.125000 0.734303
vt 0.125000 0.724990
vt 0.135570 0.750000
vt 0.390439 0.775010
vt 0.390199 0.765199
vt 0.400010 0.765439
vt 0.375000 0.775010
vt 0.375000 0.765697
vt 0.390697 0.750000
vt 0.400010 0.750000
vt 0.375000 0.760570
vt 0.400010 0.234561
vt 0.390199 0.234801
vt 0.390439 0.224990
vt 0.400010 0.250000
vt 0.390697 0.250000
vt 0.375000 0.234303
vt 0.375000 0.224990
vt 0.385570 0.250000
vt 0.599990 0.234561
vt 0.599990 0.250000
vt 0.125000 0.525010
vt 0.140439 0.525010
vt 0.390439 0.025010
vt 0.375000 0.025010
vt 0.375000 0.974990
vt 0.390439 0.974990
vt 0.349990 0.734561
vt 0.349990 0.750000
vt 0.599990 0.750000
vt 0.599990 0.765439
vn -0.0000 -0.0000 -1.0000
vn 0.0000 1.0000 0.0000
vn 1.0000 0.0000 0.0000
vn 0.0000 -0.0980 0.9952
vn 0.0000 -0.0000 1.0000
vn -0.0980 -0.0000 0.9952
vn -0.1004 -0.1004 0.9899
vn -0.9899 -0.1004 0.1004
vn -0.9952 0.0000 0.0980
vn -1.0000 0.0000 0.0000
vn -0.9952 -0.0980 -0.0000
vn -0.0980 -0.9952 -0.0000
vn 0.0000 -1.0000 -0.0000
vn 0.0000 -0.9952 0.0980
vn -0.1004 -0.9899 0.1004
vn -0.3792 -0.0981 0.9201
vn -0.3673 -0.3673 0.8545
vn -0.0981 -0.3792 0.9201
vn -0.7041 -0.0919 0.7041
vn -0.6663 -0.3347 0.6663
vn -0.3347 -0.6663 0.6663
vn -0.0919 -0.7041 0.7041
vn -0.5774 -0.5774 0.5773
vn -0.9201 -0.3792 0.0981
vn -0.8545 -0.3673 0.3673
vn -0.9201 -0.0981 0.3792
vn -0.7041 -0.7041 0.0919
vn -0.6663 -0.6663 0.3347
vn -0.0981 -0.9201 0.3792
vn -0.3673 -0.8545 0.3673
vn -0.3792 -0.9201 0.0981
vn 0.0000 -0.9239 0.3827
vn 0.0000 -0.7071 0.7071
vn 0.0000 -0.3827 0.9239
vn -0.3827 -0.9239 0.0000
vn -0.7071 -0.7071 0.0000
vn -0.9239 -0.3827 -0.0000
vn -0.3827 -0.0000 0.9239
vn -0.7071 0.0000 0.7071
vn -0.9239 0.0000 0.3827
usemtl None
s off
f 14/1/1 11/2/1 13/3/1
f 11/2/1 10/4/1 13/3/1
f 10/4/1 12/5/1 13/3/1
f 16/6/2 3/7/2 1/8/2
f 16/6/2 15/9/2 18/10/2
f 19/11/2 16/6/2 18/10/2
f 1/8/1 2/12/1 10/4/1
f 5/13/3 2/12/3 1/8/3
f 15/9/2 16/6/2 1/8/2
f 11/2/1 9/14/1 1/8/1
f 15/9/2 17/15/2 18/10/2
f 3/7/3 5/13/3 1/8/3
f 15/9/2 1/8/2 9/14/2
f 11/2/1 1/8/1 10/4/1
f 5/13/3 4/16/3 7/17/3
f 5/13/3 3/7/3 4/16/3
f 8/18/3 5/13/3 7/17/3
f 6/19/3 7/17/3 4/16/3
s 1
f 4/20/4 3/21/5 16/22/6 20/23/7
f 21/24/8 15/25/9 9/26/10 11/27/11
f 10/28/12 2/29/13 5/30/14 22/31/15
f 20/23/7 23/32/16 26/33/17 25/34/18
f 23/32/16 24/35/19 27/36/20 26/33/17
f 25/34/18 26/33/17 38/37/21 35/38/22
f 26/33/17 27/36/20 28/39/23 38/37/21
f 21/24/8 29/40/24 32/41/25 31/42/26
f 29/40/24 30/43/27 33/44/28 32/41/25
f 31/42/26 32/41/25 27/45/20 24/46/19
f 32/41/25 33/44/28 28/47/23 27/45/20
f 22/31/15 34/48/29 37/49/30 36/50/31
f 34/48/29 35/51/22 38/52/21 37/49/30
f 36/50/31 37/49/30 33/53/28 30/54/27
f 37/49/30 38/52/21 28/55/23 33/53/28
f 22/31/15 5/30/14 8/56/32 34/48/29
f 34/48/29 8/56/32 7/57/33 35/51/22
f 35/38/22 7/58/33 6/59/34 25/34/18
f 25/34/18 6/59/34 4/20/4 20/23/7
f 10/28/12 22/31/15 36/50/31 12/60/35
f 12/60/35 36/50/31 30/54/27 13/61/36
f 13/62/36 30/43/27 29/40/24 14/63/37
f 14/63/37 29/40/24 21/24/8 11/27/11
f 20/23/7 16/22/6 19/64/38 23/32/16
f 23/32/16 19/64/38 18/65/39 24/35/19
f 24/46/19 18/66/39 17/67/40 31/42/26
f 31/42/26 17/67/40 15/25/9 21/24/8

View File

@@ -1,12 +0,0 @@
# Blender MTL File: 'None'
# Material Count: 1
newmtl None
Ns 500.000001
Ka 1.000000 1.000000 1.000000
Kd 0.800000 0.800000 0.800000
Ks 0.800000 0.800000 0.800000
Ke 0.000000 0.000000 0.000000
Ni 1.450000
d 1.000000
illum 2

View File

@@ -1,88 +0,0 @@
# Blender v2.82 (sub 7) OBJ File: ''
# www.blender.org
mtllib xyzmx.mtl
o Cube_Cube.001
v -0.499961 0.500000 -0.499961
v -0.499961 -0.500000 -0.499961
v 0.499961 -0.500000 -0.499961
v -0.499961 0.499961 0.500000
v -0.499961 -0.500000 0.399961
v -0.499961 -0.399961 0.500000
v -0.499960 -0.492385 0.438244
v -0.499960 -0.470699 0.470699
v -0.499960 -0.438244 0.492385
v 0.499961 0.499961 0.500000
v 0.499961 -0.399961 0.500000
v 0.499961 -0.500000 0.399961
v 0.499961 -0.438244 0.492385
v 0.499961 -0.470699 0.470699
v 0.499961 -0.492385 0.438244
v 0.499961 0.500000 -0.499961
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.400010 0.775010
vt 0.599990 0.775010
vt 0.599990 0.974990
vt 0.400010 0.974990
vt 0.400010 0.025010
vt 0.599990 0.025010
vt 0.599990 0.224990
vt 0.400010 0.224990
vt 0.390439 0.224990
vt 0.390439 0.025010
vt 0.375000 0.224990
vt 0.375000 0.025010
vt 0.375000 0.974990
vt 0.375000 0.775010
vt 0.390439 0.775010
vt 0.390439 0.974990
vn -1.0000 0.0000 0.0000
vn 0.0000 -0.0000 -1.0000
vn -0.0000 1.0000 0.0000
vn 1.0000 0.0000 -0.0000
vn 0.0000 -0.0980 0.9952
vn 0.0000 0.0000 1.0000
vn 0.0000 -0.9952 0.0980
vn 0.0000 -1.0000 -0.0000
vn 0.0000 -0.9239 0.3827
vn 0.0000 -0.7071 0.7071
vn 0.0000 -0.3827 0.9239
usemtl None
s off
f 9/1/1 6/2/1 8/3/1
f 6/2/1 5/4/1 8/3/1
f 5/4/1 7/5/1 8/3/1
f 1/6/1 2/7/1 5/4/1
f 3/8/2 2/7/2 1/6/2
f 6/2/1 4/9/1 1/6/1
f 10/10/3 1/6/3 4/9/3
f 6/2/1 1/6/1 5/4/1
f 16/11/3 1/6/3 10/10/3
f 10/10/4 11/12/4 16/11/4
f 11/12/4 13/13/4 14/14/4
f 16/11/2 3/8/2 1/6/2
f 12/15/4 11/12/4 14/14/4
f 15/16/4 12/15/4 14/14/4
f 12/15/4 3/8/4 16/11/4
f 11/12/4 12/15/4 16/11/4
s 1
f 11/17/5 10/18/6 4/19/6 6/20/5
f 5/21/7 2/22/8 3/23/8 12/24/7
f 5/21/7 12/24/7 15/25/9 7/26/9
f 7/26/9 15/25/9 14/27/10 8/28/10
f 8/29/10 14/30/10 13/31/11 9/32/11
f 9/32/11 13/31/11 11/17/5 6/20/5

View File

@@ -1,10 +0,0 @@
# Blender MTL File: 'None'
# Material Count: 1
newmtl None
Ns 500
Ka 0.8 0.8 0.8
Kd 0.8 0.8 0.8
Ks 0.8 0.8 0.8
d 1
illum 2

View File

@@ -1,557 +0,0 @@
# Blender v2.82 (sub 7) OBJ File: ''
# www.blender.org
mtllib bevel_cube.mtl
o Cube_Cube.002
v 0.798071 -0.798071 1.000000
v 0.798071 0.798071 1.000000
v 1.000000 0.798071 0.798071
v 0.798071 1.000000 0.798071
v 1.000000 -0.798071 0.798071
v 0.798071 -1.000000 0.798071
v 1.000000 -0.798071 -0.798071
v 1.000000 0.798071 -0.798071
v 0.798071 0.798071 -1.000000
v 0.798071 1.000000 -0.798071
v 0.798071 -0.798071 -1.000000
v 0.798071 -1.000000 -0.798071
v -0.798071 -0.798071 -1.000000
v -0.798071 0.798071 -1.000000
v -1.000000 0.798071 -0.798071
v -0.798071 1.000000 -0.798071
v -0.798071 1.000000 0.798071
v -1.000000 0.798071 0.798071
v -0.798071 0.798071 1.000000
v -0.798071 -0.798071 1.000000
v -1.000000 -0.798071 -0.798071
v -1.000000 -0.798071 0.798071
v -0.798071 -1.000000 0.798071
v -0.798071 -1.000000 -0.798071
v -0.892152 -0.961030 0.798071
v -0.798071 -1.000000 0.798071
v -0.798071 -0.961030 0.892152
v -0.898181 -0.910004 0.898181
v -0.798071 -0.892152 0.961030
v -0.798071 -0.798071 1.000000
v -0.892152 -0.798071 0.961030
v -0.898181 -0.898181 0.910004
v -0.961030 -0.892152 0.798071
v -0.910004 -0.898181 0.898181
v -0.961030 -0.798071 0.892152
v -1.000000 -0.798071 0.798071
v -0.892152 0.798071 0.961030
v -0.798071 0.798071 1.000000
v -0.798071 0.892152 0.961030
v -0.898181 0.898181 0.910004
v -0.798071 0.961030 0.892152
v -0.798071 1.000000 0.798071
v -0.892152 0.961030 0.798071
v -0.898181 0.910004 0.898181
v -0.961030 0.798071 0.892152
v -0.910004 0.898181 0.898181
v -0.961030 0.892152 0.798071
v -1.000000 0.798071 0.798071
v -0.798071 -0.961030 -0.892152
v -0.798071 -1.000000 -0.798071
v -0.892152 -0.961030 -0.798071
v -0.898181 -0.910004 -0.898181
v -0.961030 -0.892152 -0.798071
v -1.000000 -0.798071 -0.798071
v -0.961030 -0.798071 -0.892152
v -0.910004 -0.898181 -0.898181
v -0.798071 -0.892152 -0.961030
v -0.898181 -0.898181 -0.910004
v -0.892152 -0.798071 -0.961030
v -0.798071 -0.798071 -1.000000
v -0.892152 0.961030 -0.798071
v -0.798071 1.000000 -0.798071
v -0.798071 0.961030 -0.892152
v -0.898181 0.910004 -0.898181
v -0.798071 0.892152 -0.961030
v -0.798071 0.798071 -1.000000
v -0.892152 0.798071 -0.961030
v -0.898181 0.898181 -0.910004
v -0.961030 0.892152 -0.798071
v -0.910004 0.898181 -0.898181
v -0.961030 0.798071 -0.892152
v -1.000000 0.798071 -0.798071
v 0.798071 -0.961030 0.892152
v 0.798071 -1.000000 0.798071
v 0.892152 -0.961030 0.798071
v 0.898181 -0.910004 0.898181
v 0.961030 -0.892152 0.798071
v 1.000000 -0.798071 0.798071
v 0.961030 -0.798071 0.892152
v 0.910004 -0.898181 0.898181
v 0.798071 -0.892152 0.961030
v 0.898181 -0.898181 0.910004
v 0.892152 -0.798071 0.961030
v 0.798071 -0.798071 1.000000
v 0.892152 0.961030 0.798071
v 0.798071 1.000000 0.798071
v 0.798071 0.961030 0.892152
v 0.898181 0.910004 0.898181
v 0.798071 0.892152 0.961030
v 0.798071 0.798071 1.000000
v 0.892152 0.798071 0.961030
v 0.898181 0.898181 0.910004
v 0.961030 0.892152 0.798071
v 0.910004 0.898181 0.898181
v 0.961030 0.798071 0.892152
v 1.000000 0.798071 0.798071
v 0.892152 -0.961030 -0.798071
v 0.798071 -1.000000 -0.798071
v 0.798071 -0.961030 -0.892152
v 0.898181 -0.910004 -0.898181
v 0.798071 -0.892152 -0.961030
v 0.798071 -0.798071 -1.000000
v 0.892152 -0.798071 -0.961030
v 0.898181 -0.898181 -0.910004
v 0.961030 -0.892152 -0.798071
v 0.910004 -0.898181 -0.898181
v 0.961030 -0.798071 -0.892152
v 1.000000 -0.798071 -0.798071
v 0.798071 0.961030 -0.892152
v 0.798071 1.000000 -0.798071
v 0.892152 0.961030 -0.798071
v 0.898181 0.910004 -0.898181
v 0.961030 0.892152 -0.798071
v 1.000000 0.798071 -0.798071
v 0.961030 0.798071 -0.892152
v 0.910004 0.898181 -0.898181
v 0.798071 0.892152 -0.961030
v 0.898181 0.898181 -0.910004
v 0.892152 0.798071 -0.961030
v 0.798071 0.798071 -1.000000
vt 0.400241 0.025241
vt 0.599759 0.025241
vt 0.599759 0.224759
vt 0.400241 0.224759
vt 0.150241 0.525241
vt 0.349759 0.525241
vt 0.349759 0.724759
vt 0.150241 0.724759
vt 0.650241 0.736519
vt 0.849759 0.736519
vt 0.849759 0.745129
vt 0.650241 0.745129
vt 0.400241 0.775241
vt 0.599759 0.775241
vt 0.599759 0.974759
vt 0.400241 0.974759
vt 0.362273 0.737273
vt 0.363750 0.737273
vt 0.362273 0.738750
vt 0.599759 0.758610
vt 0.400241 0.758610
vt 0.400241 0.741390
vt 0.599759 0.741390
vt 0.400241 0.986519
vt 0.599759 0.986519
vt 0.599759 0.995129
vt 0.400241 0.995129
vt 0.150241 0.736519
vt 0.349759 0.736519
vt 0.349759 0.745129
vt 0.150241 0.745129
vt 0.138481 0.724759
vt 0.150241 0.724759
vt 0.137727 0.737273
vt 0.150241 0.750000
vt 0.143352 0.750000
vt 0.143352 0.741563
vt 0.599759 0.981648
vt 0.606648 0.981648
vt 0.606648 0.990085
vt 0.349759 0.731648
vt 0.356648 0.731648
vt 0.356648 0.740085
vt 0.383610 0.724759
vt 0.393352 0.724759
vt 0.393352 0.731648
vt 0.376478 0.731648
vt 0.356648 0.741563
vt 0.356648 0.750000
vt 0.349759 0.750000
vt 0.650241 0.750000
vt 0.643352 0.750000
vt 0.643352 0.741563
vt 0.366390 0.525241
vt 0.356648 0.525241
vt 0.356648 0.518352
vt 0.373522 0.518352
vt 0.137727 0.738750
vt 0.393352 0.991563
vt 0.393352 0.990085
vt 0.366390 0.724759
vt 0.373522 0.731648
vt 0.393352 0.751478
vt 0.393352 0.748522
vt 0.150241 0.525241
vt 0.138481 0.525241
vt 0.400241 0.974759
vt 0.599759 0.974759
vt 0.349759 0.525241
vt 0.150241 0.513481
vt 0.349759 0.513481
vt 0.349759 0.724759
vt 0.599759 0.775241
vt 0.400241 0.775241
vt 0.393352 0.974759
vt 0.393352 0.775241
vt 0.606648 0.775241
vt 0.606648 0.974759
vt 0.633610 0.525241
vt 0.633610 0.724759
vt 0.616390 0.724759
vt 0.616390 0.525241
vt 0.150241 0.504871
vt 0.349759 0.504871
vt 0.612273 0.987273
vt 0.613750 0.987273
vt 0.612273 0.988751
vt 0.862273 0.512727
vt 0.862273 0.511250
vt 0.863750 0.512727
vt 0.599759 0.258610
vt 0.400241 0.258610
vt 0.400241 0.241390
vt 0.599759 0.241390
vt 0.849759 0.513481
vt 0.650241 0.513481
vt 0.650241 0.504871
vt 0.849759 0.504871
vt 0.383610 0.525241
vt 0.362273 0.512727
vt 0.362273 0.511250
vt 0.363750 0.512727
vt 0.599759 0.508610
vt 0.400241 0.508610
vt 0.400241 0.491390
vt 0.599759 0.491390
vt 0.136250 0.737273
vt 0.137727 0.512727
vt 0.136250 0.512727
vt 0.137727 0.511250
vt 0.637727 0.512727
vt 0.636250 0.512727
vt 0.637727 0.511250
vt 0.637727 0.737273
vt 0.637727 0.738750
vt 0.636250 0.737273
vt 0.861519 0.724759
vt 0.861519 0.525241
vt 0.870129 0.525241
vt 0.870129 0.724759
vt 0.129871 0.724759
vt 0.133437 0.731648
vt 0.125000 0.731648
vt 0.125000 0.724759
vt 0.849759 0.731648
vt 0.856648 0.731648
vt 0.856648 0.740085
vt 0.606648 0.991563
vt 0.606648 1.000000
vt 0.599759 1.000000
vt 0.129871 0.525241
vt 0.125000 0.525241
vt 0.125000 0.518352
vt 0.133437 0.518352
vt 0.143352 0.508437
vt 0.143352 0.500000
vt 0.150241 0.500000
vt 0.849759 0.525241
vt 0.849759 0.500000
vt 0.856648 0.500000
vt 0.856648 0.508437
vt 0.866563 0.518352
vt 0.875000 0.518352
vt 0.875000 0.525241
vt 0.643352 0.724759
vt 0.643352 0.731648
vt 0.626478 0.731648
vt 0.623522 0.731648
vt 0.606648 0.731648
vt 0.606648 0.724759
vt 0.349759 0.500000
vt 0.356648 0.500000
vt 0.356648 0.508437
vt 0.376478 0.518352
vt 0.393352 0.518352
vt 0.393352 0.525241
vt 0.650241 0.518352
vt 0.643352 0.518352
vt 0.643352 0.509915
vt 0.606648 0.525241
vt 0.606648 0.518352
vt 0.623522 0.518352
vt 0.643352 0.508437
vt 0.643352 0.500000
vt 0.650241 0.500000
vt 0.856648 0.741563
vt 0.866563 0.731648
vt 0.865085 0.731648
vt 0.393352 0.251478
vt 0.393352 0.248522
vt 0.606648 0.248522
vt 0.606648 0.251478
vt 0.606648 0.748522
vt 0.606648 0.751478
vt 0.393352 0.501478
vt 0.393352 0.498522
vt 0.626478 0.518352
vt 0.606648 0.498522
vt 0.606648 0.501478
vt 0.400241 0.025241
vt 0.400241 0.224759
vt 0.393352 0.224759
vt 0.393352 0.025241
vt 0.599759 0.025241
vt 0.400241 0.018352
vt 0.599759 0.018352
vt 0.849759 0.724759
vt 0.599759 0.224759
vt 0.606648 0.025241
vt 0.606648 0.224759
vt 0.599759 0.275241
vt 0.400241 0.275241
vt 0.400241 0.474759
vt 0.393352 0.474759
vt 0.393352 0.275241
vt 0.650241 0.525241
vt 0.599759 0.474759
vt 0.606648 0.275241
vt 0.606648 0.474759
vt 0.599759 0.525241
vt 0.400241 0.525241
vt 0.400241 0.724759
vt 0.650241 0.724759
vt 0.599759 0.724759
vt 0.650241 0.525241
vt 0.849759 0.525241
vt 0.849759 0.724759
vt 0.650241 0.724759
vt 0.400241 0.275241
vt 0.599759 0.275241
vt 0.599759 0.474759
vt 0.400241 0.474759
vt 0.400241 0.525241
vt 0.599759 0.525241
vt 0.599759 0.724759
vt 0.400241 0.724759
vn -1.0000 0.0000 0.0000
vn 0.0000 -1.0000 0.0000
vn 0.0000 0.7071 0.7071
vn 0.0000 0.0000 1.0000
vn 0.5774 -0.5774 0.5774
vn 0.7071 0.0000 0.7071
vn -0.7071 0.0000 0.7071
vn 0.0000 -0.7071 0.7071
vn -0.3793 -0.8439 0.3793
vn -0.3793 -0.3793 0.8439
vn -0.3793 0.3793 0.8439
vn 0.3793 -0.8439 0.3793
vn 0.8439 -0.3793 0.3793
vn 0.3793 -0.3793 0.8439
vn 0.3793 0.3793 0.8439
vn 0.3793 -0.8439 -0.3793
vn -0.3029 -0.6739 0.6739
vn -0.6739 -0.3029 0.6739
vn 0.3029 -0.6739 0.6739
vn 0.6739 -0.6739 0.3029
vn 0.6739 -0.3029 0.6739
vn -0.3827 -0.9239 0.0000
vn -0.3827 0.0000 0.9239
vn 0.0000 -0.9239 -0.3827
vn 0.3827 -0.9239 0.0000
vn 0.3827 0.0000 0.9239
vn 0.0000 -0.9239 0.3827
vn 0.0000 -0.3827 0.9239
vn 0.0000 0.3827 0.9239
vn 0.5396 0.8233 -0.1761
vn 0.5396 0.8233 0.1761
vn 0.8233 0.5396 0.1761
vn 0.8233 0.5396 -0.1761
vn 0.1533 -0.6988 -0.6988
vn -0.2338 -0.7625 -0.6033
vn -0.1763 -0.5538 -0.8137
vn 0.1787 -0.5368 -0.8246
vn -0.5319 0.5319 0.6589
vn -0.4969 0.7115 0.4969
vn -0.7115 0.4969 0.4969
vn -0.4957 0.7132 -0.4957
vn -0.4957 0.4957 -0.7132
vn -0.7207 0.4902 -0.4902
vn -0.5368 0.1787 -0.8246
vn -0.5538 -0.1763 -0.8137
vn -0.8137 -0.1763 -0.5538
vn -0.8137 0.1763 -0.5538
vn -0.1761 0.8233 -0.5396
vn 0.1761 0.8233 -0.5396
vn 0.1761 0.5396 -0.8233
vn -0.1761 0.5396 -0.8233
vn 0.7071 -0.7071 0.0000
vn 0.7008 -0.7008 -0.1330
vn 0.8233 -0.5396 -0.1761
vn 0.8315 -0.5556 0.0000
vn 0.5228 -0.6733 -0.5228
vn 0.4957 -0.4957 -0.7132
vn 0.7132 -0.4957 -0.4957
vn 0.8233 0.1761 -0.5396
vn 0.8233 -0.1761 -0.5396
vn 0.5396 -0.1761 -0.8233
vn 0.5396 0.1761 -0.8233
vn -0.6331 -0.6331 0.4454
vn -0.5774 -0.5774 0.5774
vn -0.7130 -0.5549 0.4286
vn -0.4969 -0.7115 -0.4969
vn -0.7115 -0.4969 -0.4969
vn -0.4969 -0.4969 -0.7115
vn 0.4957 0.7132 -0.4957
vn 0.7132 0.4957 -0.4957
vn 0.4957 0.4957 -0.7132
vn 0.4957 0.7132 0.4957
vn 0.5228 0.5228 0.6733
vn 0.7132 0.4957 0.4957
vn -0.5538 0.8137 0.1763
vn -0.5368 0.8246 -0.1787
vn -0.8137 0.5538 -0.1763
vn -0.8137 0.5538 0.1763
vn -0.8138 -0.5538 0.1763
vn -0.9010 -0.1934 0.3884
vn -0.9284 -0.2628 0.2628
vn -0.2342 0.8380 0.4928
vn -0.2628 0.9284 0.2628
vn -0.8380 0.2342 0.4928
vn -0.9284 0.2628 0.2628
vn -0.3793 -0.8439 -0.3793
vn -0.6033 -0.7625 -0.2338
vn -0.8138 -0.5538 -0.1763
vn -0.9284 -0.2628 -0.2628
vn -0.2628 -0.2628 -0.9284
vn -0.2588 0.9306 -0.2588
vn -0.2588 0.2588 -0.9306
vn -0.9284 0.2628 -0.2628
vn 0.2588 0.9306 0.2588
vn 0.2353 0.8501 0.4711
vn 0.8501 0.2353 0.4711
vn 0.9306 0.2588 0.2588
vn 0.2588 -0.2588 -0.9306
vn 0.9306 -0.2588 -0.2588
vn 0.2588 0.9306 -0.2588
vn 0.9306 0.2588 -0.2588
vn 0.2588 0.2588 -0.9306
vn -0.6988 -0.6988 0.1533
vn -0.6739 0.3029 0.6739
vn -0.3029 0.6739 0.6739
vn 0.3029 0.6739 0.6739
vn 0.6739 0.3029 0.6739
vn 0.9239 -0.3827 0.0000
vn 0.9239 0.0000 0.3827
vn 0.0000 1.0000 0.0000
vn 0.0000 0.0000 -1.0000
vn 1.0000 0.0000 0.0000
usemtl None
s 1
f 36/1/1 48/2/1 72/3/1 54/4/1
s off
f 50/5/2 98/6/2 74/7/2 26/8/2
f 87/9/3 41/10/3 39/11/3 89/12/3
f 84/13/4 90/14/4 38/15/4 30/16/4
f 76/17/5 80/18/5 82/19/5
f 91/20/6 83/21/6 79/22/6 95/23/6
f 31/24/7 37/25/7 45/26/7 35/27/7
f 27/28/8 73/29/8 81/30/8 29/31/8
f 25/32/9 23/33/9 27/28/9 28/34/9
f 29/31/10 20/35/10 31/36/10 32/37/10
f 37/25/11 19/38/11 39/39/11 40/40/11
f 73/29/12 6/41/12 75/42/12 76/43/12
f 77/44/13 5/45/13 79/46/13 80/47/13
f 81/30/14 82/48/14 83/49/14 1/50/14
f 89/12/15 2/51/15 91/52/15 92/53/15
f 97/54/16 12/55/16 99/56/16 100/57/16
f 27/28/17 29/31/17 32/58/17 28/34/17
f 31/24/18 35/27/18 34/59/18 32/60/18
f 81/30/19 73/29/19 76/17/19 82/19/19
f 75/61/20 77/44/20 80/47/20 76/62/20
f 79/22/21 83/21/21 82/63/21 80/64/21
f 24/65/22 23/33/22 25/32/22 51/66/22
f 20/67/23 19/68/23 37/25/23 31/24/23
f 12/69/24 24/65/24 49/70/24 99/71/24
f 6/72/25 12/69/25 97/54/25 75/61/25
f 2/73/26 1/74/26 83/21/26 91/20/26
f 23/33/27 6/72/27 73/29/27 27/28/27
f 1/74/28 20/67/28 29/75/28 81/76/28
f 19/68/29 2/73/29 89/77/29 39/78/29
s 2
f 111/79/30 85/80/31 93/81/32 113/82/33
f 99/71/34 49/70/35 57/83/36 101/84/37
f 40/85/38 44/86/39 46/87/40
f 64/88/41 68/89/42 70/90/43
f 67/91/44 59/92/45 55/93/46 71/94/47
f 63/95/48 109/96/49 117/97/50 65/98/51
f 75/61/52 97/54/53 105/99/54 77/44/55
f 100/100/56 104/101/57 106/102/58
f 115/103/59 107/104/60 103/105/61 119/106/62
f 28/34/63 32/58/64 34/107/65
f 52/108/66 56/109/67 58/110/68
f 112/111/69 116/112/70 118/113/71
f 88/114/72 92/115/73 94/116/74
f 43/117/75 61/118/76 69/119/77 47/120/78
f 33/121/79 34/122/65 35/123/80 22/124/81
f 41/10/82 17/125/83 43/126/75 44/127/39
f 45/26/84 46/128/40 47/129/78 18/130/85
f 49/70/35 24/65/86 51/66/87 52/108/66
f 53/131/88 21/132/89 55/133/46 56/134/67
f 57/83/36 58/135/68 59/136/45 13/137/90
f 61/118/76 16/138/91 63/95/48 64/88/41
f 65/98/51 14/139/92 67/140/44 68/141/42
f 69/119/77 70/142/43 71/143/47 15/144/93
f 85/80/31 4/145/94 87/146/95 88/147/72
f 93/81/32 94/148/74 95/149/96 3/150/97
f 101/84/37 11/151/98 103/152/61 104/153/57
f 105/99/54 106/154/58 107/155/60 7/156/99
f 109/96/49 10/157/100 111/158/30 112/159/69
f 113/82/33 8/160/101 115/161/59 116/162/70
f 117/97/50 118/163/71 119/164/62 9/165/102
f 33/121/79 25/32/103 28/34/63 34/107/65
f 45/26/84 37/25/104 40/85/38 46/87/40
f 39/11/105 41/10/82 44/127/39 40/166/38
f 43/117/75 47/120/78 46/167/40 44/168/39
f 57/83/36 49/70/35 52/108/66 58/110/68
f 51/66/87 53/131/88 56/109/67 52/108/66
f 55/93/46 59/92/45 58/169/68 56/170/67
f 69/119/77 61/118/76 64/88/41 70/90/43
f 63/95/48 65/98/51 68/89/42 64/88/41
f 67/91/44 71/94/47 70/171/43 68/172/42
f 93/81/32 85/80/31 88/147/72 94/148/74
f 87/9/95 89/12/106 92/115/73 88/114/72
f 91/20/107 95/23/96 94/173/74 92/174/73
f 105/99/54 97/54/53 100/57/56 106/154/58
f 99/71/34 101/84/37 104/101/57 100/100/56
f 103/105/61 107/104/60 106/175/58 104/176/57
f 117/97/50 109/96/49 112/111/69 118/113/71
f 111/79/30 113/82/33 116/162/70 112/177/69
f 115/103/59 119/106/62 118/178/71 116/179/70
f 22/180/81 21/181/89 53/182/88 33/183/79
f 18/184/85 22/180/81 35/185/80 45/186/84
f 17/187/83 16/138/91 61/118/76 43/117/75
f 15/188/93 18/184/85 47/189/78 69/190/77
f 14/191/92 13/192/90 59/92/45 67/91/44
f 21/181/89 15/188/93 71/94/47 55/93/46
f 13/192/90 11/193/98 101/194/37 57/195/36
f 16/138/91 10/196/100 109/96/49 63/95/48
f 9/197/102 14/191/92 65/198/51 117/199/50
f 8/200/101 7/201/99 107/104/60 115/103/59
f 11/193/98 9/197/102 119/106/62 103/105/61
f 7/201/99 5/202/108 77/44/55 105/99/54
f 10/196/100 4/203/94 85/80/31 111/79/30
f 3/204/97 8/200/101 113/82/33 93/81/32
f 5/202/109 3/204/97 95/23/96 79/22/109
f 4/203/94 17/187/83 41/10/82 87/9/95
f 51/66/87 25/32/103 33/121/79 53/131/88
s 6
f 110/205/110 62/206/110 42/207/110 86/208/110
s 7
f 60/209/111 66/210/111 120/211/111 102/212/111
s 10
f 108/213/112 114/214/112 96/215/112 78/216/112

View File

@@ -1,6 +1,5 @@
# Blender v2.82 (sub 7) OBJ File: ''
# www.blender.org
mtllib 000000.mtl
o Cube_Cube.001
v 0.399961 0.500000 -0.399961
v 0.500000 0.399961 -0.399961
@@ -522,7 +521,6 @@ vn -0.6663 -0.6663 0.3347
vn -0.0981 -0.9201 0.3792
vn -0.3673 -0.8545 0.3673
vn -0.3792 -0.9201 0.0981
usemtl None
s 1
f 58/1/1 41/2/2 116/3/3 134/4/4
f 96/5/5 79/6/6 3/7/7 22/8/8

View File

@@ -1,103 +1,103 @@
# Blender v2.82 (sub 7) OBJ File: ''
# www.blender.org
mtllib x.mtl
o Cube_Cube.001
v 0.499961 0.500000 -0.399961
mtllib c000001.mtl
o Cube_Cube.002
v -0.399961 0.399961 0.500000
v -0.399961 -0.399961 0.500000
v 0.499961 -0.399961 0.500000
v 0.499961 0.399961 0.500000
v 0.499961 0.399961 -0.500000
v 0.499961 0.492385 -0.438244
v 0.499961 0.438244 -0.492385
v 0.499961 0.470699 -0.470699
v 0.499961 -0.500000 -0.399961
v 0.499961 -0.399961 -0.500000
v -0.399961 -0.399961 -0.500000
v -0.399961 0.399961 -0.500000
v -0.500000 0.399961 -0.399961
v -0.500000 -0.399961 -0.399961
v -0.500000 -0.399961 0.399961
v -0.500000 0.399961 0.399961
v 0.499961 0.500000 -0.399961
v -0.399961 0.500000 -0.399961
v -0.399961 0.500000 0.399961
v 0.499961 0.500000 0.399961
v -0.399961 -0.500000 -0.399961
v -0.438244 -0.492385 -0.399961
v -0.439203 -0.483194 -0.439203
v -0.399961 -0.492385 -0.438244
v -0.470699 -0.470699 -0.399961
v -0.465612 -0.465612 -0.437212
v -0.437212 -0.465612 -0.465612
v -0.399961 -0.470699 -0.470699
v -0.457718 -0.457718 -0.457718
v -0.492385 -0.399961 -0.438244
v -0.483194 -0.439203 -0.439203
v -0.492385 -0.438244 -0.399961
v -0.470699 -0.399961 -0.470699
v -0.465612 -0.437212 -0.465612
v -0.399961 -0.438244 -0.492385
v -0.439203 -0.439203 -0.483194
v -0.438244 -0.399961 -0.492385
v -0.492385 0.438244 -0.399961
v -0.483194 0.439203 -0.439203
v -0.492385 0.399961 -0.438244
v -0.470699 0.470699 -0.399961
v -0.465612 0.465612 -0.437212
v -0.465612 0.437212 -0.465612
v -0.470699 0.399961 -0.470699
v -0.457718 0.457718 -0.457718
v -0.399961 0.492385 -0.438244
v -0.439203 0.483194 -0.439203
v -0.438244 0.492385 -0.399961
v -0.399961 0.470699 -0.470699
v -0.437212 0.465612 -0.465612
v -0.438244 0.399961 -0.492385
v -0.439203 0.439203 -0.483194
v -0.399961 0.438244 -0.492385
v -0.492385 -0.438244 0.399961
v -0.483194 -0.439203 0.439203
v -0.492385 -0.399961 0.438244
v -0.470699 -0.470699 0.399961
v -0.465612 -0.465612 0.437212
v -0.465612 -0.437212 0.465612
v -0.470699 -0.399961 0.470699
v -0.457718 -0.457718 0.457718
v -0.399961 -0.500000 0.399961
v -0.399961 -0.492385 0.438244
v -0.439203 -0.483194 0.439203
v -0.438244 -0.492385 0.399961
v -0.399961 -0.470699 0.470699
v -0.437212 -0.465612 0.465612
v -0.438244 -0.399961 0.492385
v -0.439203 -0.439203 0.483194
v -0.399961 -0.438244 0.492385
v -0.399961 0.438244 0.492385
v -0.439203 0.439203 0.483194
v -0.438244 0.399961 0.492385
v -0.399961 0.470699 0.470699
v -0.437212 0.465612 0.465612
v -0.465612 0.437212 0.465612
v -0.470699 0.399961 0.470699
v -0.457718 0.457718 0.457718
v -0.438244 0.492385 0.399961
v -0.439203 0.483194 0.439203
v -0.399961 0.492385 0.438244
v -0.470699 0.470699 0.399961
v -0.465612 0.465612 0.437212
v -0.492385 0.399961 0.438244
v -0.483194 0.439203 0.439203
v -0.492385 0.438244 0.399961
v 0.499961 -0.500000 -0.399961
v 0.499961 -0.492385 -0.438244
v 0.499961 -0.470699 -0.470699
v 0.499961 -0.438244 -0.492385
v 0.499961 0.500000 0.399961
v 0.499961 0.399961 0.500000
v 0.499961 0.492385 0.438244
v 0.499961 0.470699 0.470699
v 0.499961 0.438244 0.492385
v 0.499961 -0.399961 0.500000
v 0.499961 -0.500000 0.399961
v 0.499961 0.438244 -0.492385
v 0.499961 0.470699 -0.470699
v 0.499961 0.492385 -0.438244
v 0.499961 -0.438244 0.492385
v 0.499961 -0.470699 0.470699
v 0.499961 -0.500000 0.399961
v 0.499961 -0.492385 0.438244
v -0.500000 0.399961 -0.399961
v -0.399961 0.500000 -0.399961
v -0.399961 0.399961 -0.500000
v -0.492385 0.438244 -0.399961
v -0.470699 0.470699 -0.399961
v -0.492385 0.399961 -0.438244
v -0.483194 0.439203 -0.439203
v -0.465612 0.465612 -0.437212
v -0.457718 0.457718 -0.457718
v -0.399961 0.492385 -0.438244
v -0.399961 0.470699 -0.470699
v -0.438244 0.492385 -0.399961
v -0.439203 0.483194 -0.439203
v -0.437212 0.465612 -0.465612
v -0.438244 0.399961 -0.492385
v -0.470699 0.399961 -0.470699
v -0.399961 0.438244 -0.492385
v -0.439203 0.439203 -0.483194
v -0.465612 0.437212 -0.465612
v -0.399961 -0.399961 -0.500000
v -0.399961 -0.500000 -0.399961
v -0.500000 -0.399961 -0.399961
v -0.399961 -0.438244 -0.492385
v -0.399961 -0.470699 -0.470699
v -0.438244 -0.399961 -0.492385
v -0.439203 -0.439203 -0.483194
v -0.437212 -0.465612 -0.465612
v -0.457718 -0.457718 -0.457718
v -0.438244 -0.492385 -0.399961
v -0.470699 -0.470699 -0.399961
v -0.399961 -0.492385 -0.438244
v -0.439203 -0.483194 -0.439203
v -0.465612 -0.465612 -0.437212
v -0.492385 -0.399961 -0.438244
v -0.470699 -0.399961 -0.470699
v -0.492385 -0.438244 -0.399961
v -0.483194 -0.439203 -0.439203
v -0.465612 -0.437212 -0.465612
v -0.500000 0.399961 0.399961
v -0.399961 0.399961 0.500000
v -0.399961 0.500000 0.399961
v -0.492385 0.399961 0.438244
v -0.470699 0.399961 0.470699
v -0.492385 0.438244 0.399961
v -0.483194 0.439203 0.439203
v -0.465612 0.437212 0.465612
v -0.457718 0.457718 0.457718
v -0.399961 0.438244 0.492385
v -0.399961 0.470699 0.470699
v -0.438244 0.399961 0.492385
v -0.439203 0.439203 0.483194
v -0.437212 0.465612 0.465612
v -0.438244 0.492385 0.399961
v -0.470699 0.470699 0.399961
v -0.399961 0.492385 0.438244
v -0.439203 0.483194 0.439203
v -0.465612 0.465612 0.437212
v -0.399961 -0.399961 0.500000
v -0.500000 -0.399961 0.399961
v -0.399961 -0.500000 0.399961
v -0.438244 -0.399961 0.492385
v -0.470699 -0.399961 0.470699
v -0.399961 -0.438244 0.492385
v -0.439203 -0.439203 0.483194
v -0.465612 -0.437212 0.465612
v -0.457718 -0.457718 0.457718
v -0.492385 -0.438244 0.399961
v -0.470699 -0.470699 0.399961
v -0.492385 -0.399961 0.438244
v -0.483194 -0.439203 0.439203
v -0.465612 -0.465612 0.437212
v -0.399961 -0.492385 0.438244
v -0.399961 -0.470699 0.470699
v -0.438244 -0.492385 0.399961
v -0.439203 -0.483194 0.439203
v -0.437212 -0.465612 0.465612
v 0.499961 0.438244 0.492385
v 0.499961 0.470699 0.470699
v 0.499961 0.492385 0.438244
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
@@ -126,147 +126,164 @@ vt 0.650010 0.525010
vt 0.849990 0.525010
vt 0.849990 0.724990
vt 0.650010 0.724990
vt 0.400010 0.775010
vt 0.599990 0.775010
vt 0.599990 0.974990
vt 0.400010 0.974990
vt 0.400010 0.275010
vt 0.599990 0.275010
vt 0.599990 0.474990
vt 0.400010 0.474990
vt 0.400010 0.025010
vt 0.599990 0.025010
vt 0.599990 0.224990
vt 0.400010 0.224990
vt 0.609561 0.974990
vt 0.609801 0.984801
vt 0.599990 0.984561
vt 0.625000 0.974990
vt 0.625000 0.984303
vt 0.609303 1.000000
vt 0.599990 1.000000
vt 0.625000 0.989430
vt 0.599990 0.525010
vt 0.599990 0.515439
vt 0.609801 0.515199
vt 0.609561 0.525010
vt 0.599990 0.500000
vt 0.609303 0.500000
vt 0.625000 0.515697
vt 0.625000 0.525010
vt 0.614430 0.500000
vt 0.849990 0.515439
vt 0.859801 0.515199
vt 0.859561 0.525010
vt 0.849990 0.500000
vt 0.859303 0.500000
vt 0.875000 0.515697
vt 0.875000 0.525010
vt 0.864430 0.500000
vt 0.640439 0.525010
vt 0.640199 0.515199
vt 0.650010 0.515439
vt 0.625000 0.525010
vt 0.625000 0.515697
vt 0.640697 0.500000
vt 0.650010 0.500000
vt 0.625000 0.510570
vt 0.390439 0.025010
vt 0.390199 0.015199
vt 0.400010 0.015439
vt 0.375000 0.025010
vt 0.375000 0.015697
vt 0.390697 0.000000
vt 0.400010 0.000000
vt 0.375000 0.010570
vt 0.400010 0.984561
vt 0.390199 0.984801
vt 0.390439 0.974990
vt 0.400010 1.000000
vt 0.390697 1.000000
vt 0.375000 0.984303
vt 0.375000 0.974990
vt 0.385570 1.000000
vt 0.599990 0.765439
vt 0.609801 0.765199
vt 0.609561 0.775010
vt 0.599990 0.750000
vt 0.609303 0.750000
vt 0.625000 0.765697
vt 0.625000 0.775010
vt 0.614430 0.750000
vt 0.359561 0.724990
vt 0.359801 0.734801
vt 0.349990 0.734561
vt 0.375000 0.724990
vt 0.375000 0.734303
vt 0.359303 0.750000
vt 0.349990 0.750000
vt 0.375000 0.739430
vt 0.599990 0.724990
vt 0.609561 0.724990
vt 0.609801 0.734801
vt 0.599990 0.734561
vt 0.625000 0.724990
vt 0.625000 0.734303
vt 0.609303 0.750000
vt 0.599990 0.750000
vt 0.625000 0.739430
vt 0.150010 0.734561
vt 0.140199 0.734801
vt 0.140439 0.724990
vt 0.150010 0.750000
vt 0.140697 0.750000
vt 0.125000 0.734303
vt 0.125000 0.724990
vt 0.135570 0.750000
vt 0.390439 0.775010
vt 0.390199 0.765199
vt 0.400010 0.765439
vt 0.375000 0.775010
vt 0.375000 0.765697
vt 0.390697 0.750000
vt 0.400010 0.750000
vt 0.375000 0.760570
vt 0.400010 0.234561
vt 0.390199 0.234801
vt 0.390439 0.224990
vt 0.400010 0.250000
vt 0.390697 0.250000
vt 0.375000 0.234303
vt 0.375000 0.224990
vt 0.385570 0.250000
vt 0.599990 0.234561
vt 0.400010 0.525010
vt 0.390439 0.525010
vt 0.390199 0.515199
vt 0.400010 0.515439
vt 0.375000 0.525010
vt 0.375000 0.515697
vt 0.390697 0.500000
vt 0.400010 0.500000
vt 0.375000 0.510570
vt 0.599990 0.265439
vt 0.609801 0.265199
vt 0.609561 0.275010
vt 0.599990 0.250000
vt 0.125000 0.525010
vt 0.140439 0.525010
vt 0.609303 0.250000
vt 0.625000 0.265697
vt 0.625000 0.275010
vt 0.614430 0.250000
vt 0.859561 0.724990
vt 0.859801 0.734801
vt 0.849990 0.734561
vt 0.875000 0.724990
vt 0.875000 0.734303
vt 0.859303 0.750000
vt 0.849990 0.750000
vt 0.875000 0.739430
vt 0.390439 0.275010
vt 0.390199 0.265199
vt 0.400010 0.265439
vt 0.375000 0.275010
vt 0.375000 0.265697
vt 0.390697 0.250000
vt 0.400010 0.250000
vt 0.375000 0.260570
vt 0.599990 0.015439
vt 0.609801 0.015199
vt 0.609561 0.025010
vt 0.599990 0.000000
vt 0.625000 0.724990
vt 0.609303 0.000000
vt 0.625000 0.015697
vt 0.625000 0.025010
vt 0.614430 0.000000
vt 0.650010 0.734561
vt 0.640199 0.734801
vt 0.640439 0.724990
vt 0.650010 0.750000
vt 0.640697 0.750000
vt 0.625000 0.734303
vt 0.625000 0.724990
vt 0.635570 0.750000
vt 0.609561 0.474990
vt 0.609801 0.484801
vt 0.599990 0.484561
vt 0.625000 0.474990
vt 0.625000 0.484303
vt 0.609303 0.500000
vt 0.599990 0.500000
vt 0.625000 0.489430
vt 0.400010 0.724990
vt 0.400010 0.734561
vt 0.390199 0.734801
vt 0.390439 0.724990
vt 0.400010 0.750000
vt 0.375000 0.525010
vt 0.390697 0.750000
vt 0.375000 0.734303
vt 0.375000 0.724990
vt 0.385570 0.750000
vt 0.349990 0.515439
vt 0.359801 0.515199
vt 0.359561 0.525010
vt 0.400010 0.525010
vt 0.400010 0.515439
vt 0.349990 0.500000
vt 0.359303 0.500000
vt 0.375000 0.515697
vt 0.375000 0.525010
vt 0.364430 0.500000
vt 0.140439 0.525010
vt 0.140199 0.515199
vt 0.150010 0.515439
vt 0.125000 0.525010
vt 0.125000 0.515697
vt 0.140697 0.500000
vt 0.150010 0.500000
vt 0.125000 0.510570
vt 0.609561 0.224990
vt 0.609801 0.234801
vt 0.599990 0.234561
vt 0.625000 0.224990
vt 0.625000 0.234303
vt 0.609303 0.250000
vt 0.599990 0.250000
vt 0.625000 0.239430
vt 0.400010 0.484561
vt 0.390199 0.484801
vt 0.390439 0.474990
vt 0.400010 0.500000
vt 0.875000 0.724990
vt 0.859561 0.724990
vt 0.390697 0.500000
vt 0.375000 0.484303
vt 0.375000 0.474990
vt 0.385570 0.500000
vt 0.400010 0.234561
vt 0.400010 0.250000
vt 0.125000 0.724990
vt 0.140439 0.724990
vt 0.400010 0.015439
vt 0.400010 0.000000
vt 0.625000 0.525010
vt 0.640439 0.525010
vt 0.599990 0.724990
vt 0.599990 0.734561
vt 0.599990 0.750000
vt 0.375000 0.724990
vt 0.359561 0.724990
vt 0.599990 0.525010
vt 0.599990 0.515439
vt 0.599990 0.500000
vt 0.875000 0.525010
vt 0.859561 0.525010
vn 1.0000 0.0000 0.0000
vn 0.0000 -0.0980 0.9952
vn 0.0000 0.0980 0.9952
vn -0.1004 0.1004 0.9899
vn -0.1004 -0.1004 0.9899
vn -0.1004 -0.1004 -0.9899
vn -0.1004 0.1004 -0.9899
vn 0.0000 -0.0980 0.9952
vn -0.0000 0.0980 0.9952
vn 0.0000 0.0980 -0.9952
vn 0.0000 -0.0980 -0.9952
vn -0.9899 -0.1004 0.1004
vn -0.9899 0.1004 0.1004
vn -0.1004 -0.1004 -0.9899
vn -0.1004 0.1004 -0.9899
vn -0.9899 0.1004 -0.1004
vn -0.9899 -0.1004 -0.1004
vn -0.9899 -0.1004 0.1004
vn -0.9899 0.1004 0.1004
vn 0.0000 0.9952 -0.0980
vn -0.1004 0.9899 -0.1004
vn -0.1004 0.9899 0.1004
vn 0.0000 0.9952 0.0980
vn -0.1004 -0.9899 -0.1004
vn 0.0000 -0.9952 -0.0980
vn 0.0000 -0.9952 0.0980
vn -0.1004 -0.9899 0.1004
vn -0.3792 -0.9201 -0.0981
vn -0.3673 -0.8545 -0.3673
vn -0.0981 -0.9201 -0.3792
vn -0.7041 -0.7041 -0.0919
vn -0.6663 -0.6663 -0.3347
vn -0.3347 -0.6663 -0.6663
vn -0.0919 -0.7041 -0.7041
vn -0.5774 -0.5774 -0.5773
vn -0.9201 -0.0981 -0.3792
vn -0.8545 -0.3673 -0.3673
vn -0.9201 -0.3792 -0.0981
vn -0.7041 -0.0919 -0.7041
vn -0.6663 -0.3347 -0.6663
vn -0.0981 -0.3792 -0.9201
vn -0.3673 -0.3673 -0.8545
vn -0.3792 -0.0981 -0.9201
vn -0.9201 0.3792 -0.0981
vn -0.8545 0.3673 -0.3673
vn -0.9201 0.0981 -0.3792
@@ -275,7 +292,6 @@ vn -0.6663 0.6663 -0.3347
vn -0.6663 0.3347 -0.6663
vn -0.7041 0.0919 -0.7041
vn -0.5774 0.5774 -0.5773
vn -0.1004 0.9899 -0.1004
vn -0.0981 0.9201 -0.3792
vn -0.3673 0.8545 -0.3673
vn -0.3792 0.9201 -0.0981
@@ -284,172 +300,156 @@ vn -0.3347 0.6663 -0.6663
vn -0.3792 0.0981 -0.9201
vn -0.3673 0.3673 -0.8545
vn -0.0981 0.3792 -0.9201
vn -0.0981 -0.3792 -0.9201
vn -0.3673 -0.3673 -0.8545
vn -0.3792 -0.0981 -0.9201
vn -0.0919 -0.7041 -0.7041
vn -0.3347 -0.6663 -0.6663
vn -0.6663 -0.3347 -0.6663
vn -0.7041 -0.0919 -0.7041
vn -0.5773 -0.5774 -0.5774
vn -0.3792 -0.9201 -0.0981
vn -0.3673 -0.8545 -0.3673
vn -0.0981 -0.9201 -0.3792
vn -0.7041 -0.7041 -0.0919
vn -0.6663 -0.6663 -0.3347
vn -0.9201 -0.0981 -0.3792
vn -0.8545 -0.3673 -0.3673
vn -0.9201 -0.3792 -0.0981
vn -0.9201 0.0981 0.3792
vn -0.8545 0.3673 0.3673
vn -0.9201 0.3792 0.0981
vn -0.7041 0.0919 0.7041
vn -0.6663 0.3347 0.6663
vn -0.6663 0.6663 0.3347
vn -0.7041 0.7041 0.0919
vn -0.5774 0.5774 0.5773
vn -0.0981 0.3792 0.9201
vn -0.3673 0.3673 0.8545
vn -0.3792 0.0981 0.9201
vn -0.0919 0.7041 0.7041
vn -0.3347 0.6663 0.6663
vn -0.1004 0.9899 0.1004
vn -0.3792 0.9201 0.0981
vn -0.3673 0.8545 0.3673
vn -0.0981 0.9201 0.3792
vn -0.3792 -0.0981 0.9201
vn -0.3673 -0.3673 0.8545
vn -0.0981 -0.3792 0.9201
vn -0.7041 -0.0919 0.7041
vn -0.6663 -0.3347 0.6663
vn -0.3347 -0.6663 0.6663
vn -0.0919 -0.7041 0.7041
vn -0.5774 -0.5774 0.5773
vn -0.9201 -0.3792 0.0981
vn -0.8545 -0.3673 0.3673
vn -0.9201 -0.0981 0.3792
vn -0.7041 -0.7041 0.0919
vn -0.6663 -0.6663 0.3347
vn -0.6663 -0.3347 0.6663
vn -0.7041 -0.0919 0.7041
vn -0.5774 -0.5774 0.5773
vn -0.1004 -0.9899 0.1004
vn -0.0981 -0.9201 0.3792
vn -0.3673 -0.8545 0.3673
vn -0.3792 -0.9201 0.0981
vn 0.0000 -0.9239 0.3827
vn 0.0000 -0.7071 0.7071
vn 0.0000 -0.3827 0.9239
vn 0.0000 -0.9239 -0.3827
vn 0.0000 -0.7071 -0.7071
vn 0.0000 -0.3827 -0.9239
vn 0.0000 0.9952 0.0980
vn -0.0919 -0.7041 0.7041
vn -0.3347 -0.6663 0.6663
vn -0.3792 -0.0981 0.9201
vn -0.3673 -0.3673 0.8545
vn -0.0981 -0.3792 0.9201
vn -0.0981 0.3792 0.9201
vn -0.3673 0.3673 0.8545
vn -0.3792 0.0981 0.9201
vn -0.0919 0.7041 0.7041
vn -0.3347 0.6663 0.6663
vn -0.6663 0.3347 0.6663
vn -0.7041 0.0919 0.7041
vn -0.5774 0.5774 0.5773
vn -0.3792 0.9201 0.0981
vn -0.3673 0.8545 0.3673
vn -0.0981 0.9201 0.3792
vn -0.7041 0.7041 0.0919
vn -0.6663 0.6663 0.3347
vn -0.9201 0.0981 0.3792
vn -0.8545 0.3673 0.3673
vn -0.9201 0.3792 0.0981
vn 0.0000 0.9239 0.3827
vn 0.0000 0.7071 0.7071
vn 0.0000 0.3827 0.9239
vn 0.0000 0.9952 -0.0980
vn 0.0000 0.9239 -0.3827
vn 0.0000 0.7071 -0.7071
vn 0.0000 0.3827 -0.9239
usemtl None
vn -0.0000 -0.9952 0.0980
vn -0.0000 -0.9239 0.3827
vn -0.0000 -0.7071 0.7071
vn -0.0000 -0.3827 0.9239
vn -0.0000 -0.9952 -0.0980
vn -0.0000 -0.9239 -0.3827
vn -0.0000 -0.7071 -0.7071
vn -0.0000 -0.3827 -0.9239
usemtl Default_OBJ
s off
f 4/1/1 5/2/1 2/3/1
f 11/4/1 13/5/1 14/6/1
f 7/7/1 1/8/1 6/9/1
f 10/10/1 7/7/1 9/11/1
f 17/12/1 16/13/1 19/14/1
f 7/7/1 6/9/1 9/11/1
f 1/8/1 7/7/1 2/3/1
f 1/8/1 2/3/1 5/2/1
f 11/4/1 6/9/1 1/8/1
f 11/4/1 17/12/1 6/9/1
f 6/9/1 8/15/1 9/11/1
f 17/12/1 12/16/1 16/13/1
f 12/16/1 11/4/1 14/6/1
f 15/17/1 12/16/1 14/6/1
f 20/18/1 17/12/1 19/14/1
f 12/16/1 17/12/1 11/4/1
f 18/19/1 19/14/1 16/13/1
f 3/20/1 1/8/1 5/2/1
f 93/1/1 92/2/1 91/3/1
f 4/4/1 16/5/1 95/6/1
f 6/7/1 83/8/1 85/9/1
f 13/10/1 5/11/1 88/12/1
f 3/13/1 16/5/1 4/4/1
f 16/5/1 96/14/1 95/6/1
f 3/13/1 90/15/1 91/3/1
f 5/11/1 13/10/1 92/2/1
f 16/5/1 3/13/1 13/10/1
f 83/8/1 5/11/1 92/2/1
f 5/11/1 87/16/1 88/12/1
f 95/6/1 94/17/1 4/4/1
f 92/2/1 3/13/1 91/3/1
f 5/11/1 83/8/1 6/7/1
f 3/13/1 92/2/1 13/10/1
f 85/9/1 86/18/1 6/7/1
f 89/19/1 13/10/1 88/12/1
f 83/8/1 84/20/1 85/9/1
s 1
f 16/21/2 12/22/3 60/23/4 78/24/5
f 40/25/6 23/26/7 2/27/8 7/28/9
f 79/29/10 59/30/11 21/31/12 42/32/13
f 41/33/14 6/34/15 17/35/16 80/36/17
f 21/31/12 24/37/18 27/38/19 26/39/20
f 24/37/18 25/40/21 28/41/22 27/38/19
f 26/39/20 27/38/19 39/42/23 36/43/24
f 27/38/19 28/41/22 29/44/25 39/42/23
f 22/45/26 30/46/27 33/47/28 32/48/29
f 30/46/27 31/49/30 34/50/31 33/47/28
f 32/48/29 33/47/28 28/51/22 25/52/21
f 33/47/28 34/50/31 29/53/25 28/51/22
f 23/26/7 35/54/32 38/55/33 37/56/34
f 35/54/32 36/57/24 39/58/23 38/55/33
f 37/56/34 38/55/33 34/59/31 31/60/30
f 38/55/33 39/58/23 29/61/25 34/59/31
f 40/25/6 43/62/35 46/63/36 45/64/37
f 43/62/35 44/65/38 47/66/39 46/63/36
f 45/64/37 46/63/36 58/67/40 55/68/41
f 46/63/36 47/66/39 48/69/42 58/67/40
f 41/33/14 49/70/43 52/71/44 51/72/45
f 49/70/43 50/73/46 53/74/47 52/71/44
f 51/72/45 52/71/44 47/75/39 44/76/38
f 52/71/44 53/74/47 48/77/42 47/75/39
f 42/32/13 54/78/48 57/79/49 56/80/50
f 54/78/48 55/81/41 58/82/40 57/79/49
f 56/80/50 57/79/49 53/83/47 50/84/46
f 57/79/49 58/82/40 48/85/42 53/83/47
f 59/30/11 62/86/51 65/87/52 64/88/53
f 62/86/51 63/89/54 66/90/55 65/87/52
f 64/88/53 65/87/52 77/91/56 74/92/57
f 65/87/52 66/90/55 67/93/58 77/91/56
f 60/23/4 68/94/59 71/95/60 70/96/61
f 68/94/59 69/97/62 72/98/63 71/95/60
f 70/96/61 71/95/60 66/99/55 63/100/54
f 71/95/60 72/98/63 67/101/58 66/99/55
f 61/102/64 73/103/65 76/104/66 75/105/67
f 73/103/65 74/106/57 77/107/56 76/104/66
f 75/105/67 76/104/66 72/108/63 69/109/62
f 76/104/66 77/107/56 67/110/58 72/108/63
f 78/24/5 81/111/68 84/112/69 83/113/70
f 81/111/68 82/114/71 85/115/72 84/112/69
f 83/113/70 84/112/69 96/116/73 93/117/74
f 84/112/69 85/115/72 86/118/75 96/116/73
f 79/29/10 87/119/76 90/120/77 89/121/78
f 87/119/76 88/122/79 91/123/80 90/120/77
f 89/121/78 90/120/77 85/124/72 82/125/71
f 90/120/77 91/123/80 86/126/75 85/124/72
f 80/36/17 92/127/81 95/128/82 94/129/83
f 92/127/81 93/130/74 96/131/73 95/128/82
f 94/129/83 95/128/82 91/132/80 88/133/79
f 95/128/82 96/131/73 86/134/75 91/132/80
f 80/36/17 17/35/16 20/135/84 92/127/81
f 92/127/81 20/135/84 19/136/85 93/130/74
f 93/117/74 19/137/85 18/138/86 83/113/70
f 83/113/70 18/138/86 16/21/2 78/24/5
f 6/34/15 41/33/14 51/72/45 8/139/87
f 8/139/87 51/72/45 44/76/38 9/140/88
f 9/141/88 44/65/38 43/62/35 10/142/89
f 10/142/89 43/62/35 40/25/6 7/28/9
f 61/102/64 22/45/26 32/48/29 73/103/65
f 73/103/65 32/48/29 25/52/21 74/106/57
f 74/92/57 25/40/21 24/37/18 64/88/53
f 64/88/53 24/37/18 21/31/12 59/30/11
f 41/33/14 80/36/17 94/129/83 49/70/43
f 49/70/43 94/129/83 88/133/79 50/73/46
f 50/84/46 88/122/79 87/119/76 56/80/50
f 56/80/50 87/119/76 79/29/10 42/32/13
f 11/143/90 61/102/64 75/105/67 13/144/91
f 13/144/91 75/105/67 69/109/62 14/145/92
f 14/146/92 69/97/62 68/94/59 15/147/93
f 15/147/93 68/94/59 60/23/4 12/22/3
f 78/24/5 60/23/4 70/96/61 81/111/68
f 81/111/68 70/96/61 63/100/54 82/114/71
f 82/125/71 63/89/54 62/86/51 89/121/78
f 89/121/78 62/86/51 59/30/11 79/29/10
f 22/45/26 1/148/94 3/149/95 30/46/27
f 30/46/27 3/149/95 5/150/96 31/49/30
f 31/60/30 5/151/96 4/152/97 37/56/34
f 37/56/34 4/152/97 2/27/8 23/26/7
f 23/26/7 40/25/6 45/64/37 35/54/32
f 35/54/32 45/64/37 55/68/41 36/57/24
f 36/43/24 55/81/41 54/78/48 26/39/20
f 26/39/20 54/78/48 42/32/13 21/31/12
f 1/148/94 22/45/26 61/102/64 11/143/90
f 1/21/2 2/22/3 3/23/4 4/24/5
f 5/25/6 6/26/7 7/27/8 8/28/9
f 9/29/10 10/30/11 11/31/12 12/32/13
f 13/33/14 14/34/15 15/35/16 16/36/17
f 17/37/18 18/38/19 19/39/20 20/40/21
f 18/38/19 21/41/22 22/42/23 19/39/20
f 20/40/21 19/39/20 23/43/24 24/44/25
f 19/39/20 22/42/23 25/45/26 23/43/24
f 10/30/11 26/46/27 27/47/28 28/48/29
f 26/46/27 29/49/30 30/50/31 27/47/28
f 28/48/29 27/47/28 22/51/23 21/52/22
f 27/47/28 30/50/31 25/53/26 22/51/23
f 7/27/8 31/54/32 32/55/33 33/56/34
f 31/54/32 24/57/25 23/58/24 32/55/33
f 33/56/34 32/55/33 30/59/31 29/60/30
f 32/55/33 23/58/24 25/61/26 30/59/31
f 9/29/10 34/62/35 35/63/36 36/64/37
f 34/62/35 37/65/38 38/66/39 35/63/36
f 36/64/37 35/63/36 39/67/40 40/68/41
f 35/63/36 38/66/39 41/69/42 39/67/40
f 14/34/15 42/70/43 43/71/44 44/72/45
f 42/70/43 45/73/46 46/74/47 43/71/44
f 44/72/45 43/71/44 38/75/39 37/76/38
f 43/71/44 46/74/47 41/77/42 38/75/39
f 8/28/9 47/78/48 48/79/49 49/80/50
f 47/78/48 40/81/41 39/82/40 48/79/49
f 49/80/50 48/79/49 46/83/47 45/84/46
f 48/79/49 39/82/40 41/85/42 46/83/47
f 11/31/12 50/86/51 51/87/52 52/88/53
f 50/86/51 53/89/54 54/90/55 51/87/52
f 52/88/53 51/87/52 55/91/56 56/92/57
f 51/87/52 54/90/55 57/93/58 55/91/56
f 58/94/59 59/95/60 60/96/61 61/97/62
f 59/95/60 62/98/63 63/99/64 60/96/61
f 61/97/62 60/96/61 54/100/55 53/101/54
f 60/96/61 63/99/64 57/102/58 54/100/55
f 2/22/3 64/103/65 65/104/66 66/105/67
f 64/103/65 56/106/57 55/107/56 65/104/66
f 66/105/67 65/104/66 63/108/64 62/109/63
f 65/104/66 55/107/56 57/110/58 63/108/64
f 1/21/2 67/111/68 68/112/69 69/113/70
f 67/111/68 70/114/71 71/115/72 68/112/69
f 69/113/70 68/112/69 72/116/73 73/117/74
f 68/112/69 71/115/72 74/118/75 72/116/73
f 15/35/16 75/119/76 76/120/77 77/121/78
f 75/119/76 78/122/79 79/123/80 76/120/77
f 77/121/78 76/120/77 71/124/72 70/125/71
f 76/120/77 79/123/80 74/126/75 71/124/72
f 12/32/13 80/127/81 81/128/82 82/129/83
f 80/127/81 73/130/74 72/131/73 81/128/82
f 82/129/83 81/128/82 79/132/80 78/133/79
f 81/128/82 72/131/73 74/134/75 79/132/80
f 16/36/17 15/35/16 77/121/78 96/135/84
f 96/135/84 77/121/78 70/125/71 95/136/85
f 95/137/85 70/114/71 67/111/68 94/138/86
f 94/138/86 67/111/68 1/21/2 4/24/5
f 15/35/16 14/34/15 44/72/45 75/119/76
f 75/119/76 44/72/45 37/76/38 78/122/79
f 78/133/79 37/65/38 34/62/35 82/129/83
f 82/129/83 34/62/35 9/29/10 12/32/13
f 17/37/18 58/94/59 61/97/62 18/38/19
f 18/38/19 61/97/62 53/101/54 21/41/22
f 21/52/22 53/89/54 50/86/51 28/48/29
f 28/48/29 50/86/51 11/31/12 10/30/11
f 14/34/15 13/33/14 89/139/87 42/70/43
f 42/70/43 89/139/87 88/140/88 45/73/46
f 45/84/46 88/141/88 87/142/89 49/80/50
f 49/80/50 87/142/89 5/25/6 8/28/9
f 58/94/59 92/143/90 93/144/91 59/95/60
f 59/95/60 93/144/91 91/145/92 62/98/63
f 62/109/63 91/146/92 90/147/93 66/105/67
f 66/105/67 90/147/93 3/23/4 2/22/3
f 2/22/3 1/21/2 69/113/70 64/103/65
f 64/103/65 69/113/70 73/117/74 56/106/57
f 56/92/57 73/130/74 80/127/81 52/88/53
f 52/88/53 80/127/81 12/32/13 11/31/12
f 10/30/11 9/29/10 36/64/37 26/46/27
f 26/46/27 36/64/37 40/68/41 29/49/30
f 29/60/30 40/81/41 47/78/48 33/56/34
f 33/56/34 47/78/48 8/28/9 7/27/8
f 83/148/94 17/37/18 20/40/21 84/149/95
f 84/149/95 20/40/21 24/44/25 85/150/96
f 85/151/96 24/57/25 31/54/32 86/152/97
f 86/152/97 31/54/32 7/27/8 6/26/7
f 17/37/18 83/148/94 92/143/90 58/94/59

View File

@@ -0,0 +1,301 @@
# Blender v2.82 (sub 7) OBJ File: ''
# www.blender.org
mtllib c000011.mtl
o Cube_Cube.003
v 0.495579 0.504344 -0.499961
v 0.495579 0.504344 0.399961
v 0.504305 -0.495618 0.399961
v 0.503432 -0.395583 0.500000
v 0.504049 -0.466318 0.470699
v 0.503766 -0.433864 0.492385
v 0.504239 -0.488003 0.438244
v 0.496118 0.442590 0.492385
v 0.496452 0.404309 0.500000
v 0.495834 0.475044 0.470699
v 0.495645 0.496729 0.438244
v 0.504305 -0.495618 -0.499961
v -0.395583 -0.503471 -0.499961
v -0.433931 -0.496191 -0.499961
v -0.466574 -0.474789 -0.499961
v -0.404309 0.496491 -0.499961
v -0.503471 0.395583 -0.499961
v -0.474789 0.466574 -0.499961
v -0.496491 -0.404309 -0.499961
v -0.488542 -0.442524 -0.499961
v -0.442524 0.488542 -0.499961
v -0.496190 0.433931 -0.499961
v -0.496491 -0.404309 0.399961
v -0.503471 0.395583 0.399961
v -0.403436 0.396456 0.500000
v -0.396456 -0.403436 0.500000
v -0.404309 0.496491 0.399961
v -0.434737 -0.403770 0.492385
v -0.435354 -0.443019 0.483194
v -0.396122 -0.441717 0.492385
v -0.467191 -0.404053 0.470699
v -0.461779 -0.441258 0.465612
v -0.433132 -0.469410 0.465612
v -0.395838 -0.474171 0.470699
v -0.453706 -0.461695 0.457718
v -0.488542 -0.442524 0.399961
v -0.479343 -0.443403 0.439203
v -0.488876 -0.404242 0.438244
v -0.466574 -0.474789 0.399961
v -0.461531 -0.469657 0.437212
v -0.395583 -0.503471 0.399961
v -0.395649 -0.495856 0.438244
v -0.434970 -0.487008 0.439203
v -0.433931 -0.496191 0.399961
v -0.495856 0.395649 0.438244
v -0.487008 0.434970 0.439203
v -0.496191 0.433931 0.399961
v -0.474171 0.395838 0.470699
v -0.469410 0.433132 0.465612
v -0.469657 0.461531 0.437212
v -0.474789 0.466574 0.399961
v -0.461695 0.453706 0.457718
v -0.403770 0.434737 0.492385
v -0.443019 0.435354 0.483194
v -0.441718 0.396122 0.492385
v -0.404053 0.467191 0.470699
v -0.441258 0.461779 0.465612
v -0.442524 0.488542 0.399961
v -0.443403 0.479343 0.439203
v -0.404243 0.488876 0.438244
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.150010 0.525010
vt 0.349990 0.525010
vt 0.349990 0.724990
vt 0.150010 0.724990
vt 0.400010 0.775010
vt 0.599990 0.775010
vt 0.599990 0.974990
vt 0.400010 0.974990
vt 0.400010 0.025010
vt 0.599990 0.025010
vt 0.599990 0.224990
vt 0.400010 0.224990
vt 0.599990 0.765439
vt 0.609801 0.765199
vt 0.609561 0.775010
vt 0.599990 0.750000
vt 0.609303 0.750000
vt 0.625000 0.765697
vt 0.625000 0.775010
vt 0.614430 0.750000
vt 0.359561 0.724990
vt 0.359801 0.734801
vt 0.349990 0.734561
vt 0.375000 0.724990
vt 0.375000 0.734303
vt 0.359303 0.750000
vt 0.349990 0.750000
vt 0.375000 0.739430
vt 0.599990 0.724990
vt 0.609561 0.724990
vt 0.609801 0.734801
vt 0.599990 0.734561
vt 0.625000 0.724990
vt 0.625000 0.734303
vt 0.609303 0.750000
vt 0.599990 0.750000
vt 0.625000 0.739430
vt 0.150010 0.734561
vt 0.140199 0.734801
vt 0.140439 0.724990
vt 0.150010 0.750000
vt 0.140697 0.750000
vt 0.125000 0.734303
vt 0.125000 0.724990
vt 0.135570 0.750000
vt 0.390439 0.775010
vt 0.390199 0.765199
vt 0.400010 0.765439
vt 0.375000 0.775010
vt 0.375000 0.765697
vt 0.390697 0.750000
vt 0.400010 0.750000
vt 0.375000 0.760570
vt 0.400010 0.234561
vt 0.390199 0.234801
vt 0.390439 0.224990
vt 0.400010 0.250000
vt 0.390697 0.250000
vt 0.375000 0.234303
vt 0.375000 0.224990
vt 0.385570 0.250000
vt 0.599990 0.234561
vt 0.599990 0.250000
vt 0.125000 0.525010
vt 0.140439 0.525010
vt 0.599990 0.525010
vt 0.609561 0.525010
vt 0.625000 0.525010
vt 0.625000 0.974990
vt 0.609561 0.974990
vt 0.390439 0.025010
vt 0.375000 0.025010
vt 0.375000 0.974990
vt 0.390439 0.974990
vt 0.400010 0.724990
vt 0.400010 0.734561
vt 0.400010 0.750000
vt 0.375000 0.525010
vt 0.359561 0.525010
vt 0.400010 0.525010
vn 1.0000 0.0087 -0.0000
vn 1.0000 0.0088 -0.0000
vn 1.0000 0.0087 -0.0001
vn 0.0000 0.0000 -1.0000
vn -0.9960 0.0893 -0.0000
vn -0.9943 -0.1067 0.0000
vn -0.9890 -0.1090 0.1004
vn -0.9907 0.0917 0.1004
vn -0.1013 0.0995 0.9899
vn -0.0995 -0.1013 0.9899
vn 0.0009 -0.0980 0.9952
vn -0.0009 0.0980 0.9952
vn -0.0087 0.9951 0.0980
vn -0.0087 1.0000 -0.0000
vn -0.1067 0.9943 -0.0000
vn -0.1090 0.9890 0.1004
vn -0.3783 -0.1014 0.9201
vn -0.3641 -0.3705 0.8545
vn -0.0948 -0.3801 0.9201
vn -0.7033 -0.0981 0.7041
vn -0.6634 -0.3405 0.6663
vn -0.3289 -0.6692 0.6663
vn -0.0858 -0.7049 0.7041
vn -0.5723 -0.5824 0.5773
vn -0.9167 -0.3872 0.0981
vn -0.8512 -0.3748 0.3674
vn -0.9192 -0.1062 0.3792
vn -0.6979 -0.7102 0.0919
vn -0.6605 -0.6721 0.3347
vn -0.0917 -0.9907 0.1004
vn -0.0901 -0.9209 0.3792
vn -0.3599 -0.8576 0.3674
vn -0.3712 -0.9234 0.0982
vn -0.9209 0.0901 0.3792
vn -0.8576 0.3599 0.3674
vn -0.9234 0.3712 0.0982
vn -0.7049 0.0858 0.7041
vn -0.6692 0.3289 0.6663
vn -0.6721 0.6605 0.3347
vn -0.7102 0.6979 0.0919
vn -0.5824 0.5723 0.5773
vn -0.1014 0.3783 0.9201
vn -0.3705 0.3641 0.8545
vn -0.3801 0.0948 0.9201
vn -0.0981 0.7033 0.7041
vn -0.3405 0.6634 0.6663
vn -0.3872 0.9167 0.0981
vn -0.3748 0.8512 0.3674
vn -0.1062 0.9192 0.3792
vn -0.3907 0.9205 -0.0000
vn -0.7132 0.7009 -0.0000
vn -0.9272 0.3746 -0.0000
vn 0.0087 -0.9951 0.0980
vn 0.0081 -0.9238 0.3827
vn 0.0062 -0.7071 0.7071
vn 0.0033 -0.3827 0.9239
vn -0.0081 0.9238 0.3827
vn -0.0062 0.7071 0.7071
vn -0.0033 0.3827 0.9239
vn -0.0893 -0.9960 0.0000
vn -0.3746 -0.9272 0.0000
vn -0.7009 -0.7132 0.0000
vn -0.9205 -0.3907 0.0000
vn 0.0087 -1.0000 0.0000
usemtl Default_OBJ.003
s off
f 1/1/1 2/2/1 3/3/1
f 3/3/1 4/4/1 5/5/1
f 4/4/1 6/6/1 5/5/1
f 7/7/2 3/3/2 5/5/2
f 8/8/3 9/9/3 10/10/3
f 9/9/1 2/2/1 10/10/1
f 2/2/1 11/11/1 10/10/1
f 12/12/1 1/1/1 3/3/1
f 4/4/1 3/3/1 9/9/1
f 3/3/1 2/2/1 9/9/1
f 13/13/4 14/14/4 15/15/4
f 16/16/4 17/17/4 18/18/4
f 13/13/4 1/1/4 12/12/4
f 13/13/4 16/16/4 1/1/4
f 16/16/4 19/19/4 17/17/4
f 19/19/4 13/13/4 15/15/4
f 20/20/4 19/19/4 15/15/4
f 21/21/4 16/16/4 18/18/4
f 19/19/4 16/16/4 13/13/4
f 22/22/4 18/18/4 17/17/4
s 1
f 17/23/5 19/24/6 23/25/7 24/26/8
f 25/27/9 26/28/10 4/29/11 9/30/12
f 2/31/13 1/32/14 16/33/15 27/34/16
f 26/28/10 28/35/17 29/36/18 30/37/19
f 28/35/17 31/38/20 32/39/21 29/36/18
f 30/37/19 29/36/18 33/40/22 34/41/23
f 29/36/18 32/39/21 35/42/24 33/40/22
f 23/25/7 36/43/25 37/44/26 38/45/27
f 36/43/25 39/46/28 40/47/29 37/44/26
f 38/45/27 37/44/26 32/48/21 31/49/20
f 37/44/26 40/47/29 35/50/24 32/48/21
f 41/51/30 42/52/31 43/53/32 44/54/33
f 42/52/31 34/55/23 33/56/22 43/53/32
f 44/54/33 43/53/32 40/57/29 39/58/28
f 43/53/32 33/56/22 35/59/24 40/57/29
f 24/26/8 45/60/34 46/61/35 47/62/36
f 45/60/34 48/63/37 49/64/38 46/61/35
f 47/62/36 46/61/35 50/65/39 51/66/40
f 46/61/35 49/64/38 52/67/41 50/65/39
f 25/27/9 53/68/42 54/69/43 55/70/44
f 53/68/42 56/71/45 57/72/46 54/69/43
f 55/70/44 54/69/43 49/73/38 48/74/37
f 54/69/43 57/72/46 52/75/41 49/73/38
f 27/34/16 58/76/47 59/77/48 60/78/49
f 58/76/47 51/79/40 50/80/39 59/77/48
f 60/78/49 59/77/48 57/81/46 56/82/45
f 59/77/48 50/80/39 52/83/41 57/81/46
f 27/34/16 16/33/15 21/84/50 58/76/47
f 58/76/47 21/84/50 18/85/51 51/79/40
f 51/66/40 18/86/51 22/87/52 47/62/36
f 47/62/36 22/87/52 17/23/5 24/26/8
f 41/51/30 3/88/53 7/89/54 42/52/31
f 42/52/31 7/89/54 5/90/55 34/55/23
f 34/41/23 5/91/55 6/92/56 30/37/19
f 30/37/19 6/92/56 4/29/11 26/28/10
f 2/31/13 27/34/16 60/78/49 11/93/57
f 11/93/57 60/78/49 56/82/45 10/94/58
f 10/95/58 56/71/45 53/68/42 8/96/59
f 8/96/59 53/68/42 25/27/9 9/30/12
f 13/97/60 41/51/30 44/54/33 14/98/61
f 14/98/61 44/54/33 39/58/28 15/99/62
f 15/100/62 39/46/28 36/43/25 20/101/63
f 20/101/63 36/43/25 23/25/7 19/24/6
f 24/26/8 23/25/7 38/45/27 45/60/34
f 45/60/34 38/45/27 31/49/20 48/63/37
f 48/74/37 31/38/20 28/35/17 55/70/44
f 55/70/44 28/35/17 26/28/10 25/27/9
f 12/102/64 3/88/53 41/51/30 13/97/60

View File

@@ -0,0 +1,214 @@
# Blender v2.82 (sub 7) OBJ File: ''
# www.blender.org
mtllib c000111.mtl
o Cube_Cube.004
v 0.499961 -0.500000 0.399961
v 0.499961 -0.399961 0.500000
v 0.499961 -0.470699 0.470699
v 0.499961 -0.438244 0.492385
v 0.499961 -0.492385 0.438244
v 0.499961 0.499961 0.500000
v -0.399962 -0.500000 -0.499961
v -0.438245 -0.492385 -0.499961
v -0.470700 -0.470699 -0.499961
v -0.500000 -0.399961 -0.499961
v -0.492385 -0.438244 -0.499961
v -0.500000 0.499961 -0.499961
v -0.500000 -0.399961 0.399961
v -0.500000 0.499962 0.399961
v -0.399961 0.499962 0.500000
v -0.399961 -0.399961 0.500000
v -0.438244 -0.399961 0.492385
v -0.439203 -0.439203 0.483194
v -0.399962 -0.438243 0.492385
v -0.470699 -0.399961 0.470699
v -0.465612 -0.437211 0.465612
v -0.437212 -0.465612 0.465612
v -0.399961 -0.470699 0.470699
v -0.457718 -0.457718 0.457718
v -0.492385 -0.438244 0.399961
v -0.483194 -0.439203 0.439203
v -0.492385 -0.399960 0.438244
v -0.470699 -0.470699 0.399961
v -0.465612 -0.465612 0.437212
v -0.399961 -0.500000 0.399961
v -0.399961 -0.492384 0.438244
v -0.439203 -0.483194 0.439203
v -0.438244 -0.492385 0.399961
v 0.499961 0.500000 -0.499961
v 0.499961 -0.500000 -0.499961
v -0.492384 0.499961 0.438244
v -0.470699 0.499961 0.470699
v -0.438244 0.499962 0.492385
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.150010 0.525010
vt 0.349990 0.724990
vt 0.150010 0.724990
vt 0.599990 0.775010
vt 0.400010 0.974990
vt 0.400010 0.775010
vt 0.599990 0.765439
vt 0.609561 0.775010
vt 0.599990 0.750000
vt 0.609801 0.765199
vt 0.625000 0.775010
vt 0.614430 0.750000
vt 0.625000 0.765697
vt 0.359561 0.724990
vt 0.349990 0.734561
vt 0.375000 0.724990
vt 0.359801 0.734801
vt 0.349990 0.750000
vt 0.375000 0.739430
vt 0.359303 0.750000
vt 0.609561 0.724990
vt 0.599990 0.734561
vt 0.599990 0.724990
vt 0.625000 0.724990
vt 0.609801 0.734801
vt 0.599990 0.750000
vt 0.625000 0.739430
vt 0.609303 0.750000
vt 0.000000 0.000000
vt 0.400010 0.525010
vt 0.599990 0.525010
vt 0.609561 0.525010
vt 0.609561 0.974990
vt 0.400010 0.724990
vt 0.400010 0.734561
vt 0.400010 0.750000
vt 0.375000 0.525010
vt 0.359561 0.525010
vt 0.349990 0.525010
vt 0.150010 0.734561
vt 0.150010 0.750000
vt 0.400010 0.750000
vt 0.400010 0.765439
vt 0.599990 0.974990
vt 0.609303 0.750000
vt 0.375000 0.734303
vt 0.625000 0.734303
vt 0.625000 0.525010
vt 0.625000 0.974990
vn 0.8575 -0.5120 0.0504
vn 0.8321 -0.0544 0.5520
vn 0.8321 -0.3922 0.3922
vn 0.2425 -0.3713 0.8963
vn 0.3162 -0.8765 0.3630
vn 0.6933 0.5095 0.5096
vn -0.0588 -0.5971 -0.8000
vn -0.3423 -0.8263 -0.4472
vn -0.5657 -0.5657 -0.6000
vn -0.5971 -0.0588 -0.8000
vn -0.8264 -0.3423 -0.4472
vn -0.5774 0.5773 -0.5774
vn -0.9905 -0.0970 0.0970
vn -0.7244 0.6857 0.0714
vn -0.0970 -0.0970 0.9905
vn -0.0714 0.6857 0.7244
vn -0.3783 -0.0972 0.9206
vn -0.0972 -0.3783 0.9206
vn -0.7041 -0.0919 0.7041
vn -0.3703 -0.3703 0.8519
vn -0.0919 -0.7041 0.7041
vn -0.5774 -0.5773 0.5774
vn -0.3266 -0.6683 0.6683
vn -0.9206 -0.3783 0.0972
vn -0.9206 -0.0972 0.3783
vn -0.7041 -0.7041 0.0919
vn -0.8519 -0.3703 0.3703
vn -0.6683 -0.3266 0.6683
vn -0.0972 -0.9206 0.3783
vn -0.3783 -0.9206 0.0972
vn -0.0970 -0.9905 0.0970
vn -0.3703 -0.8519 0.3703
vn -0.6683 -0.6683 0.3266
vn 0.5773 0.5774 -0.5773
vn 0.5000 -0.7071 -0.5000
vn -0.6894 0.6657 0.2856
vn -0.5277 0.6657 0.5276
vn -0.2856 0.6657 0.6894
usemtl Default_OBJ.005
s 1
f 1/1/1 2/2/2 3/3/3
f 2/2/2 4/4/4 3/3/3
f 5/5/5 1/1/1 3/3/3
f 2/2/2 1/1/1 6/6/6
f 7/7/7 8/8/8 9/9/9
f 10/10/10 7/7/7 9/9/9
f 11/11/11 10/10/10 9/9/9
f 12/12/12 13/13/13 14/14/14
f 16/15/15 6/16/6 15/17/16
f 17/18/17 19/19/18 16/15/15
f 20/20/19 18/21/20 17/18/17
f 18/21/20 23/22/21 19/19/18
f 18/21/20 24/23/22 22/24/23
f 25/25/24 27/26/25 13/13/13
f 28/27/26 26/28/27 25/25/24
f 26/28/27 20/29/19 27/26/25
f 26/28/27 24/30/22 21/31/28
f 31/32/29 33/33/30 30/34/31
f 23/35/21 32/36/32 31/32/29
f 32/36/32 28/37/26 33/33/30
f 32/36/32 24/38/22 29/39/33
f 10/10/10 12/12/12 34/40/34
f 34/40/34 1/1/1 35/41/35
f 34/40/34 14/14/14 15/17/16
f 1/42/1 31/32/29 30/34/31
f 5/43/5 23/35/21 31/32/29
f 23/22/21 4/44/4 19/19/18
f 4/44/4 16/15/15 19/19/18
f 7/45/7 33/33/30 8/46/8
f 33/33/30 9/47/9 8/46/8
f 9/48/9 25/25/24 11/49/11
f 25/25/24 10/50/10 11/49/11
f 13/13/13 36/51/36 14/14/14
f 27/26/25 37/52/37 36/51/36
f 37/53/37 17/18/17 38/54/38
f 17/18/17 15/17/16 38/54/38
f 35/41/35 30/34/31 7/45/7
f 12/12/12 10/50/10 13/13/13
f 16/15/15 2/55/2 6/16/6
f 17/18/17 18/21/20 19/19/18
f 20/20/19 21/56/28 18/21/20
f 18/21/20 22/24/23 23/22/21
f 18/21/20 21/56/28 24/23/22
f 25/25/24 26/28/27 27/26/25
f 28/27/26 29/57/33 26/28/27
f 26/28/27 21/31/28 20/29/19
f 26/28/27 29/57/33 24/30/22
f 31/32/29 32/36/32 33/33/30
f 23/35/21 22/58/23 32/36/32
f 32/36/32 29/39/33 28/37/26
f 32/36/32 22/58/23 24/38/22
f 35/41/35 7/7/7 34/40/34
f 7/7/7 10/10/10 34/40/34
f 34/40/34 6/16/6 1/1/1
f 12/12/12 14/14/14 34/40/34
f 14/14/14 36/51/36 38/54/38
f 36/51/36 37/52/37 38/54/38
f 38/54/38 15/17/16 14/14/14
f 15/17/16 6/16/6 34/40/34
f 1/42/1 5/43/5 31/32/29
f 5/43/5 3/59/3 23/35/21
f 23/22/21 3/60/3 4/44/4
f 4/44/4 2/55/2 16/15/15
f 7/45/7 30/34/31 33/33/30
f 33/33/30 28/37/26 9/47/9
f 9/48/9 28/27/26 25/25/24
f 25/25/24 13/13/13 10/50/10
f 13/13/13 27/26/25 36/51/36
f 27/26/25 20/29/19 37/52/37
f 37/53/37 20/20/19 17/18/17
f 17/18/17 16/15/15 15/17/16
f 35/41/35 1/42/1 30/34/31

View File

@@ -0,0 +1,213 @@
# Blender v2.82 (sub 7) OBJ File: ''
# www.blender.org
mtllib c001001.mtl
o Cube_Cube.010
v -0.499961 0.500000 -0.399961
v -0.499961 0.399961 0.500000
v -0.499961 0.500000 0.399961
v -0.499961 0.470699 0.470699
v -0.499961 0.492385 0.438244
v -0.499961 0.492385 -0.438244
v -0.499961 0.470699 -0.470699
v -0.499961 0.438244 -0.492385
v -0.499961 0.399961 -0.500000
v -0.499961 -0.399961 -0.500000
v -0.499961 -0.438244 -0.492385
v -0.499961 -0.470699 -0.470699
v -0.499961 0.438244 0.492385
v -0.499961 -0.399961 0.500000
v -0.499961 -0.500000 0.399961
v -0.499961 -0.470699 0.470699
v 0.499961 0.500000 0.399961
v 0.499961 0.399961 -0.500000
v 0.499961 0.500000 -0.399961
v -0.499961 -0.438244 0.492385
v -0.499961 -0.500000 -0.399961
v -0.499961 -0.492385 0.438244
v -0.499961 -0.492385 -0.438244
v 0.499961 0.470699 -0.470699
v 0.499961 0.492385 -0.438244
v 0.499961 0.492385 0.438244
v 0.499961 0.470699 0.470699
v 0.499961 0.438244 0.492385
v 0.499961 0.399961 0.500000
v 0.499961 -0.399961 0.500000
v 0.499961 -0.438244 0.492385
v 0.499961 -0.470699 0.470699
v 0.499961 0.438244 -0.492385
v 0.499961 -0.399961 -0.500000
v 0.499961 -0.500000 -0.399961
v 0.499961 -0.470699 -0.470699
v 0.499961 -0.438244 -0.492385
v 0.499961 -0.500000 0.399961
v 0.499961 -0.492385 -0.438244
v 0.499961 -0.492385 0.438244
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.150010 0.525010
vt 0.349990 0.525010
vt 0.349990 0.724990
vt 0.150010 0.724990
vt 0.650010 0.525010
vt 0.849990 0.525010
vt 0.849990 0.724990
vt 0.650010 0.724990
vt 0.400010 0.025010
vt 0.599990 0.025010
vt 0.599990 0.224990
vt 0.400010 0.224990
vt 0.599990 0.234561
vt 0.400010 0.234561
vt 0.599990 0.250000
vt 0.400010 0.250000
vt 0.125000 0.724990
vt 0.125000 0.525010
vt 0.140439 0.525010
vt 0.140439 0.724990
vt 0.400010 0.015439
vt 0.599990 0.015439
vt 0.400010 0.000000
vt 0.599990 0.000000
vt 0.625000 0.724990
vt 0.625000 0.525010
vt 0.640439 0.525010
vt 0.640439 0.724990
vt 0.400010 0.724990
vt 0.599990 0.724990
vt 0.599990 0.734561
vt 0.400010 0.734561
vt 0.599990 0.750000
vt 0.400010 0.750000
vt 0.375000 0.525010
vt 0.375000 0.724990
vt 0.359561 0.724990
vt 0.359561 0.525010
vt 0.599990 0.525010
vt 0.400010 0.525010
vt 0.400010 0.515439
vt 0.599990 0.515439
vt 0.400010 0.500000
vt 0.599990 0.500000
vt 0.875000 0.525010
vt 0.875000 0.724990
vt 0.859561 0.724990
vt 0.859561 0.525010
vn -1.0000 0.0000 -0.0000
vn 1.0000 -0.0000 0.0000
vn -0.0000 -0.9952 -0.0980
vn -0.0000 -0.9952 0.0980
vn 0.0000 0.9952 -0.0980
vn 0.0000 0.9952 0.0980
vn 0.0000 0.0980 -0.9952
vn 0.0000 -0.0980 -0.9952
vn 0.0000 -0.3827 -0.9239
vn 0.0000 -0.7071 -0.7071
vn -0.0000 -0.9239 -0.3827
vn 0.0000 0.3827 -0.9239
vn 0.0000 0.7071 -0.7071
vn 0.0000 0.9239 -0.3827
vn -0.0000 -0.0980 0.9952
vn -0.0000 -0.3827 0.9239
vn -0.0000 -0.7071 0.7071
vn -0.0000 -0.9239 0.3827
vn -0.0000 0.0980 0.9952
vn -0.0000 0.3827 0.9239
vn -0.0000 0.7071 0.7071
vn 0.0000 0.9239 0.3827
usemtl Default_OBJ.006
s off
f 1/1/1 2/2/1 3/3/1
f 4/4/1 5/5/1 3/3/1
f 1/1/1 6/6/1 7/7/1
f 8/8/1 9/9/1 7/7/1
f 10/10/1 11/11/1 12/12/1
f 2/2/1 13/13/1 4/4/1
f 14/14/1 15/15/1 16/16/1
f 15/15/1 14/14/1 9/9/1
f 2/2/1 1/1/1 14/14/1
f 10/10/1 15/15/1 9/9/1
f 17/17/2 18/18/2 19/19/2
f 3/3/1 2/2/1 4/4/1
f 9/9/1 1/1/1 7/7/1
f 1/1/1 9/9/1 14/14/1
f 20/20/1 14/14/1 16/16/1
f 21/21/1 10/10/1 12/12/1
f 15/15/1 22/22/1 16/16/1
f 15/15/1 10/10/1 21/21/1
f 12/12/1 23/23/1 21/21/1
f 24/24/2 25/25/2 19/19/2
f 17/17/2 26/26/2 27/27/2
f 28/28/2 29/29/2 27/27/2
f 30/30/2 31/31/2 32/32/2
f 18/18/2 33/33/2 24/24/2
f 34/34/2 35/35/2 36/36/2
f 35/35/2 34/34/2 29/29/2
f 18/18/2 17/17/2 34/34/2
f 30/30/2 35/35/2 29/29/2
f 19/19/2 18/18/2 24/24/2
f 29/29/2 17/17/2 27/27/2
f 17/17/2 29/29/2 34/34/2
f 37/37/2 34/34/2 36/36/2
f 38/38/2 30/30/2 32/32/2
f 35/35/2 39/39/2 36/36/2
f 35/35/2 30/30/2 38/38/2
f 32/32/2 40/40/2 38/38/2
s 1
f 35/41/3 38/42/4 15/43/4 21/44/3
f 1/45/5 3/46/6 17/47/6 19/48/5
f 9/49/7 18/50/7 34/51/8 10/52/8
f 10/52/8 34/51/8 37/53/9 11/54/9
f 11/54/9 37/53/9 36/55/10 12/56/10
f 12/57/10 36/58/10 39/59/11 23/60/11
f 23/60/11 39/59/11 35/41/3 21/44/3
f 18/50/7 9/49/7 8/61/12 33/62/12
f 33/62/12 8/61/12 7/63/13 24/64/13
f 24/65/13 7/66/13 6/67/14 25/68/14
f 25/68/14 6/67/14 1/45/5 19/48/5
f 30/69/15 14/70/15 20/71/16 31/72/16
f 31/72/16 20/71/16 16/73/17 32/74/17
f 32/75/17 16/76/17 22/77/18 40/78/18
f 40/78/18 22/77/18 15/43/4 38/42/4
f 2/79/19 29/80/19 28/81/20 13/82/20
f 13/82/20 28/81/20 27/83/21 4/84/21
f 4/85/21 27/86/21 26/87/22 5/88/22
f 5/88/22 26/87/22 17/47/6 3/46/6
f 29/80/19 2/79/19 14/70/15 30/69/15

View File

@@ -0,0 +1,131 @@
# Blender v2.82 (sub 7) OBJ File: ''
# www.blender.org
mtllib c001011.mtl
o Cube_Cube.011
v -0.499961 -0.500000 -0.499961
v -0.499961 -0.500000 0.499961
v -0.499961 0.500000 0.499961
v -0.499961 0.500000 -0.499961
v 0.399961 0.500000 -0.499961
v 0.438244 0.492385 -0.499961
v 0.470699 0.470699 -0.499961
v 0.399961 -0.500000 -0.499961
v 0.500000 -0.399961 -0.499961
v 0.470699 -0.470699 -0.499961
v 0.500000 0.399961 -0.499961
v 0.492385 0.438244 -0.499961
v 0.438244 -0.492385 -0.499961
v 0.492385 -0.438244 -0.499961
v 0.399961 0.500000 0.499961
v 0.399961 -0.500000 0.499961
v 0.500000 -0.399961 0.499961
v 0.500000 0.399961 0.499961
v 0.438244 -0.492385 0.499961
v 0.470699 -0.470699 0.499961
v 0.438244 0.492385 0.499961
v 0.470699 0.470699 0.499961
v 0.492385 0.438244 0.499961
v 0.492385 -0.438244 0.499961
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.150010 0.525010
vt 0.349990 0.525010
vt 0.349990 0.724990
vt 0.150010 0.724990
vt 0.400010 0.025010
vt 0.599990 0.025010
vt 0.599990 0.224990
vt 0.400010 0.224990
vt 0.599990 0.234561
vt 0.400010 0.234561
vt 0.599990 0.250000
vt 0.400010 0.250000
vt 0.125000 0.724990
vt 0.125000 0.525010
vt 0.140439 0.525010
vt 0.140439 0.724990
vt 0.400010 0.724990
vt 0.599990 0.724990
vt 0.599990 0.734561
vt 0.400010 0.734561
vt 0.599990 0.750000
vt 0.400010 0.750000
vt 0.375000 0.525010
vt 0.375000 0.724990
vt 0.359561 0.724990
vt 0.359561 0.525010
vt 0.400010 0.525010
vt 0.599990 0.525010
vn -1.0000 0.0000 0.0000
vn 0.0000 0.0000 -1.0000
vn 0.0000 0.0000 1.0000
vn 0.9952 -0.0980 0.0000
vn 0.9952 0.0980 0.0000
vn 0.0000 -1.0000 0.0000
vn 0.0980 -0.9952 0.0000
vn 0.3827 -0.9239 0.0000
vn 0.7071 -0.7071 0.0000
vn 0.9239 -0.3827 0.0000
vn 0.0980 0.9952 0.0000
vn 0.3827 0.9239 0.0000
vn 0.7071 0.7071 0.0000
vn 0.9239 0.3827 0.0000
vn 0.0000 1.0000 0.0000
usemtl Default_OBJ.007
s off
f 1/1/1 2/2/1 3/3/1
f 4/4/1 1/1/1 3/3/1
f 5/5/2 6/6/2 7/7/2
f 8/8/2 9/9/2 10/10/2
f 5/5/2 1/1/2 4/4/2
f 5/5/2 8/8/2 1/1/2
f 8/8/2 11/11/2 9/9/2
f 11/11/2 5/5/2 7/7/2
f 12/12/2 11/11/2 7/7/2
f 13/13/2 8/8/2 10/10/2
f 11/11/2 8/8/2 5/5/2
f 14/14/2 10/10/2 9/9/2
f 15/15/3 3/3/3 2/2/3
f 15/15/3 2/2/3 16/16/3
f 16/16/3 17/17/3 15/15/3
f 17/17/3 18/18/3 15/15/3
f 16/16/3 19/19/3 20/20/3
f 21/21/3 15/15/3 22/22/3
f 17/17/3 16/16/3 20/20/3
f 18/18/3 23/23/3 22/22/3
f 15/15/3 18/18/3 22/22/3
f 20/20/3 24/24/3 17/17/3
s 1
f 9/25/4 11/26/5 18/27/5 17/28/4
f 2/29/6 1/30/6 8/31/7 16/32/7
f 16/32/7 8/31/7 13/33/8 19/34/8
f 19/34/8 13/33/8 10/35/9 20/36/9
f 20/37/9 10/38/9 14/39/10 24/40/10
f 24/40/10 14/39/10 9/25/4 17/28/4
f 5/41/11 15/42/11 21/43/12 6/44/12
f 6/44/12 21/43/12 22/45/13 7/46/13
f 7/47/13 22/48/13 23/49/14 12/50/14
f 12/50/14 23/49/14 18/27/5 11/26/5
f 4/51/15 3/52/15 15/42/11 5/41/11

View File

@@ -0,0 +1,92 @@
# Blender v2.82 (sub 7) OBJ File: ''
# www.blender.org
mtllib c001111.mtl
o Cube_Cube.011
v 0.505169 -0.500000 -0.494698
v -0.494698 -0.500000 -0.505169
v 0.495745 -0.500000 0.405174
v 0.494698 -0.399961 0.505208
v 0.495005 -0.470699 0.475909
v 0.494698 0.499961 0.505208
v 0.495344 -0.492385 0.443455
v 0.494777 -0.438244 0.497593
v -0.504122 -0.500000 0.394704
v -0.505169 -0.399961 0.494737
v -0.505169 0.499961 0.494737
v -0.504523 -0.492385 0.432985
v -0.504863 -0.470699 0.465438
v 0.505169 0.500000 -0.494698
v -0.494698 0.500000 -0.505169
v -0.505090 -0.438244 0.487123
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.150010 0.525010
vt 0.349990 0.525010
vt 0.349990 0.724990
vt 0.150010 0.724990
vt 0.400010 0.025010
vt 0.599990 0.025010
vt 0.599990 0.224990
vt 0.400010 0.224990
vt 0.599990 0.234561
vt 0.400010 0.234561
vt 0.599990 0.250000
vt 0.400010 0.250000
vt 0.125000 0.724990
vt 0.125000 0.525010
vt 0.140439 0.525010
vt 0.140439 0.724990
vn 0.9280 -0.3696 0.0461
vn 0.8262 -0.0544 0.5607
vn 0.8279 -0.3922 0.4009
vn 0.8122 0.4082 0.4168
vn 0.4436 -0.8264 0.3469
vn 0.4385 -0.3423 0.8310
vn 0.5834 -0.5774 -0.5713
vn 0.5834 0.5774 -0.5713
vn -0.8990 -0.0438 0.4357
vn -0.9013 0.3015 -0.3110
vn -0.8948 -0.4451 0.0344
vn -0.3997 -0.4082 -0.8207
vn -0.4508 -0.8263 0.3376
vn -0.8361 -0.3922 0.3835
vn -0.4125 0.8165 0.4040
vn -0.4558 -0.3423 0.8216
usemtl Default_OBJ.007
s 1
f 3/1/1 4/2/2 5/3/3
f 3/1/1 6/4/4 4/2/2
f 7/5/5 3/1/1 5/3/3
f 8/6/6 5/3/3 4/2/2
f 1/7/7 14/8/8 3/1/1
f 10/9/9 15/10/10 9/11/11
f 14/8/8 2/12/12 15/10/10
f 9/11/11 12/13/13 13/14/14
f 11/15/15 14/8/8 15/10/10
f 10/9/9 9/11/11 13/14/14
f 11/15/15 6/4/4 14/8/8
f 14/8/8 1/7/7 2/12/12
f 13/14/14 16/16/16 10/9/9
f 4/17/2 6/18/4 11/19/15 10/20/9
f 2/21/12 1/22/7 3/23/1 9/24/11
f 9/24/11 3/23/1 7/25/5 12/26/13
f 12/26/13 7/25/5 5/27/3 13/28/14
f 13/29/14 5/30/3 8/31/6 16/32/16
f 16/32/16 8/31/6 4/17/2 10/20/9
f 14/8/8 6/4/4 3/1/1
f 15/10/10 2/12/12 9/11/11
f 11/15/15 15/10/10 10/9/9

View File

@@ -1,6 +1,5 @@
# Blender v2.82 (sub 7) OBJ File: ''
# www.blender.org
mtllib xymxmy.mtl
o Cube_Cube.001
v 0.499961 0.500000 -0.499961
v 0.499961 -0.500000 -0.499961
@@ -32,7 +31,6 @@ vn -1.0000 0.0000 0.0000
vn 0.0000 -0.0000 1.0000
vn 0.0000 -1.0000 -0.0000
vn 0.0000 1.0000 0.0000
usemtl None
s off
f 2/1/1 6/2/1 5/3/1
f 1/4/1 2/1/1 5/3/1

View File

@@ -21,6 +21,7 @@ export default class SomaSolver {
this.solutions = [];
const combosWithRots = polycubes.slice(1).map(polycube => polycube.getUniqueRotations().map((rot) => rot.getAllPositionsInCube(this.dim)).flat());
const combos = [polycubes[0].getAllPositionsInCube(this.dim), ...combosWithRots];
console.log(combos.flat().length);
this.backtrackSolve(this.solutionCube, combos, new SomaSolution(this.dim));
this.solutions = SomaSolution.filterUnique(this.solutions);
}
@@ -46,3 +47,92 @@ export default class SomaSolver {
}
}
}
class SomaSolution {
constructor(dim) {
if (dim < 0 || dim % 1 !== 0) {
throw new Error("Dimension must be a whole positive integer!");
}
this.dim = dim;
this.solutionSpaces = [];
}
static filterUnique(solutions) {
if (solutions.length === 0) {
return [];
}
const uniqueSolns = [solutions[0]];
for (const solution of solutions) {
let foundMatch = false;
for (const rotation of solution.getUniqueRotations()) {
let end = uniqueSolns.length;
for (let i = 0; i < end; i++) {
if (rotation.matches(uniqueSolns[i])) {
foundMatch = true;
}
}
}
if (!foundMatch) {
uniqueSolns.push(solution);
}
}
return uniqueSolns;
}
getUniqueRotations() {
if (this.solutionSpaces.length === 0) {
return [];
}
const result = [];
const allRots = this.solutionSpaces.map(space => space.getAllRotations());
for (let i = 0; i < allRots[0].length; i++) {
const solnRot = new SomaSolution(this.dim);
allRots.forEach(rotGroup => solnRot.addSpace(rotGroup[i]));
result.push(solnRot);
}
return result;
}
matches(solution) {
for (let i = 0; i < this.solutionSpaces.length; i++) {
if (!this.solutionSpaces[i].matches(solution.solutionSpaces[i])) {
return false;
}
}
return true;
}
addSpace(space) {
this.solutionSpaces.push(space);
}
print() {
let accum = "";
console.log("---");
for (let x = 0; x < this.dim; x++) {
for (let y = 0; y < this.dim; y++) {
for (let z = 0; z < this.dim; z++) {
for (const space of this.solutionSpaces) {
if (space.at(x, y, z)) {
accum += space.getId();
}
}
}
console.log(accum);
accum = "";
}
if (x !== this.dim - 1) {
console.log("-");
}
}
console.log("---");
}
at(x, y, z) {
for (const space of this.solutionSpaces) {
if (space.at(x, y, z)) {
return space.getId();
}
}
return 0;
}
clone() {
const clone = new SomaSolution(this.dim);
clone.solutionSpaces = this.solutionSpaces.slice();
return clone;
}
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

BIN
public/solver/main.wasm Normal file

Binary file not shown.

View File

@@ -1,911 +0,0 @@
import {
BufferGeometry,
FileLoader,
Float32BufferAttribute,
Group,
LineBasicMaterial,
LineSegments,
Loader,
Material,
Mesh,
MeshPhongMaterial,
Points,
PointsMaterial,
Vector3
} from 'three';
// o object_name | g group_name
const _object_pattern = /^[og]\s*(.+)?/;
// mtllib file_reference
const _material_library_pattern = /^mtllib /;
// usemtl material_name
const _material_use_pattern = /^usemtl /;
// usemap map_name
const _map_use_pattern = /^usemap /;
const _vA = new Vector3();
const _vB = new Vector3();
const _vC = new Vector3();
const _ab = new Vector3();
const _cb = new Vector3();
function ParserState() {
const state = {
objects: [],
object: {},
vertices: [],
normals: [],
colors: [],
uvs: [],
materials: {},
materialLibraries: [],
startObject: function ( name, fromDeclaration ) {
// If the current object (initial from reset) is not from a g/o declaration in the parsed
// file. We need to use it for the first parsed g/o to keep things in sync.
if ( this.object && this.object.fromDeclaration === false ) {
this.object.name = name;
this.object.fromDeclaration = ( fromDeclaration !== false );
return;
}
const previousMaterial = ( this.object && typeof this.object.currentMaterial === 'function' ? this.object.currentMaterial() : undefined );
if ( this.object && typeof this.object._finalize === 'function' ) {
this.object._finalize( true );
}
this.object = {
name: name || '',
fromDeclaration: ( fromDeclaration !== false ),
geometry: {
vertices: [],
normals: [],
colors: [],
uvs: [],
hasUVIndices: false
},
materials: [],
smooth: true,
startMaterial: function ( name, libraries ) {
const previous = this._finalize( false );
// New usemtl declaration overwrites an inherited material, except if faces were declared
// after the material, then it must be preserved for proper MultiMaterial continuation.
if ( previous && ( previous.inherited || previous.groupCount <= 0 ) ) {
this.materials.splice( previous.index, 1 );
}
const material = {
index: this.materials.length,
name: name || '',
mtllib: ( Array.isArray( libraries ) && libraries.length > 0 ? libraries[ libraries.length - 1 ] : '' ),
smooth: ( previous !== undefined ? previous.smooth : this.smooth ),
groupStart: ( previous !== undefined ? previous.groupEnd : 0 ),
groupEnd: - 1,
groupCount: - 1,
inherited: false,
clone: function ( index ) {
const cloned = {
index: ( typeof index === 'number' ? index : this.index ),
name: this.name,
mtllib: this.mtllib,
smooth: this.smooth,
groupStart: 0,
groupEnd: - 1,
groupCount: - 1,
inherited: false
};
cloned.clone = this.clone.bind( cloned );
return cloned;
}
};
this.materials.push( material );
return material;
},
currentMaterial: function () {
if ( this.materials.length > 0 ) {
return this.materials[ this.materials.length - 1 ];
}
return undefined;
},
_finalize: function ( end ) {
const lastMultiMaterial = this.currentMaterial();
if ( lastMultiMaterial && lastMultiMaterial.groupEnd === - 1 ) {
lastMultiMaterial.groupEnd = this.geometry.vertices.length / 3;
lastMultiMaterial.groupCount = lastMultiMaterial.groupEnd - lastMultiMaterial.groupStart;
lastMultiMaterial.inherited = false;
}
// Ignore objects tail materials if no face declarations followed them before a new o/g started.
if ( end && this.materials.length > 1 ) {
for ( let mi = this.materials.length - 1; mi >= 0; mi -- ) {
if ( this.materials[ mi ].groupCount <= 0 ) {
this.materials.splice( mi, 1 );
}
}
}
// Guarantee at least one empty material, this makes the creation later more straight forward.
if ( end && this.materials.length === 0 ) {
this.materials.push( {
name: '',
smooth: this.smooth
} );
}
return lastMultiMaterial;
}
};
// Inherit previous objects material.
// Spec tells us that a declared material must be set to all objects until a new material is declared.
// If a usemtl declaration is encountered while this new object is being parsed, it will
// overwrite the inherited material. Exception being that there was already face declarations
// to the inherited material, then it will be preserved for proper MultiMaterial continuation.
if ( previousMaterial && previousMaterial.name && typeof previousMaterial.clone === 'function' ) {
const declared = previousMaterial.clone( 0 );
declared.inherited = true;
this.object.materials.push( declared );
}
this.objects.push( this.object );
},
finalize: function () {
if ( this.object && typeof this.object._finalize === 'function' ) {
this.object._finalize( true );
}
},
parseVertexIndex: function ( value, len ) {
const index = parseInt( value, 10 );
return ( index >= 0 ? index - 1 : index + len / 3 ) * 3;
},
parseNormalIndex: function ( value, len ) {
const index = parseInt( value, 10 );
return ( index >= 0 ? index - 1 : index + len / 3 ) * 3;
},
parseUVIndex: function ( value, len ) {
const index = parseInt( value, 10 );
return ( index >= 0 ? index - 1 : index + len / 2 ) * 2;
},
addVertex: function ( a, b, c ) {
const src = this.vertices;
const dst = this.object.geometry.vertices;
dst.push( src[ a + 0 ], src[ a + 1 ], src[ a + 2 ] );
dst.push( src[ b + 0 ], src[ b + 1 ], src[ b + 2 ] );
dst.push( src[ c + 0 ], src[ c + 1 ], src[ c + 2 ] );
},
addVertexPoint: function ( a ) {
const src = this.vertices;
const dst = this.object.geometry.vertices;
dst.push( src[ a + 0 ], src[ a + 1 ], src[ a + 2 ] );
},
addVertexLine: function ( a ) {
const src = this.vertices;
const dst = this.object.geometry.vertices;
dst.push( src[ a + 0 ], src[ a + 1 ], src[ a + 2 ] );
},
addNormal: function ( a, b, c ) {
const src = this.normals;
const dst = this.object.geometry.normals;
dst.push( src[ a + 0 ], src[ a + 1 ], src[ a + 2 ] );
dst.push( src[ b + 0 ], src[ b + 1 ], src[ b + 2 ] );
dst.push( src[ c + 0 ], src[ c + 1 ], src[ c + 2 ] );
},
addFaceNormal: function ( a, b, c ) {
const src = this.vertices;
const dst = this.object.geometry.normals;
_vA.fromArray( src, a );
_vB.fromArray( src, b );
_vC.fromArray( src, c );
_cb.subVectors( _vC, _vB );
_ab.subVectors( _vA, _vB );
_cb.cross( _ab );
_cb.normalize();
dst.push( _cb.x, _cb.y, _cb.z );
dst.push( _cb.x, _cb.y, _cb.z );
dst.push( _cb.x, _cb.y, _cb.z );
},
addColor: function ( a, b, c ) {
const src = this.colors;
const dst = this.object.geometry.colors;
if ( src[ a ] !== undefined ) dst.push( src[ a + 0 ], src[ a + 1 ], src[ a + 2 ] );
if ( src[ b ] !== undefined ) dst.push( src[ b + 0 ], src[ b + 1 ], src[ b + 2 ] );
if ( src[ c ] !== undefined ) dst.push( src[ c + 0 ], src[ c + 1 ], src[ c + 2 ] );
},
addUV: function ( a, b, c ) {
const src = this.uvs;
const dst = this.object.geometry.uvs;
dst.push( src[ a + 0 ], src[ a + 1 ] );
dst.push( src[ b + 0 ], src[ b + 1 ] );
dst.push( src[ c + 0 ], src[ c + 1 ] );
},
addDefaultUV: function () {
const dst = this.object.geometry.uvs;
dst.push( 0, 0 );
dst.push( 0, 0 );
dst.push( 0, 0 );
},
addUVLine: function ( a ) {
const src = this.uvs;
const dst = this.object.geometry.uvs;
dst.push( src[ a + 0 ], src[ a + 1 ] );
},
addFace: function ( a, b, c, ua, ub, uc, na, nb, nc ) {
const vLen = this.vertices.length;
let ia = this.parseVertexIndex( a, vLen );
let ib = this.parseVertexIndex( b, vLen );
let ic = this.parseVertexIndex( c, vLen );
this.addVertex( ia, ib, ic );
this.addColor( ia, ib, ic );
// normals
if ( na !== undefined && na !== '' ) {
const nLen = this.normals.length;
ia = this.parseNormalIndex( na, nLen );
ib = this.parseNormalIndex( nb, nLen );
ic = this.parseNormalIndex( nc, nLen );
this.addNormal( ia, ib, ic );
} else {
this.addFaceNormal( ia, ib, ic );
}
// uvs
if ( ua !== undefined && ua !== '' ) {
const uvLen = this.uvs.length;
ia = this.parseUVIndex( ua, uvLen );
ib = this.parseUVIndex( ub, uvLen );
ic = this.parseUVIndex( uc, uvLen );
this.addUV( ia, ib, ic );
this.object.geometry.hasUVIndices = true;
} else {
// add placeholder values (for inconsistent face definitions)
this.addDefaultUV();
}
},
addPointGeometry: function ( vertices ) {
this.object.geometry.type = 'Points';
const vLen = this.vertices.length;
for ( let vi = 0, l = vertices.length; vi < l; vi ++ ) {
const index = this.parseVertexIndex( vertices[ vi ], vLen );
this.addVertexPoint( index );
this.addColor( index );
}
},
addLineGeometry: function ( vertices, uvs ) {
this.object.geometry.type = 'Line';
const vLen = this.vertices.length;
const uvLen = this.uvs.length;
for ( let vi = 0, l = vertices.length; vi < l; vi ++ ) {
this.addVertexLine( this.parseVertexIndex( vertices[ vi ], vLen ) );
}
for ( let uvi = 0, l = uvs.length; uvi < l; uvi ++ ) {
this.addUVLine( this.parseUVIndex( uvs[ uvi ], uvLen ) );
}
}
};
state.startObject( '', false );
return state;
}
//
class OBJLoader extends Loader {
constructor( manager ) {
super( manager );
this.materials = null;
}
load( url, onLoad, onProgress, onError ) {
const scope = this;
const loader = new FileLoader( this.manager );
loader.setPath( this.path );
loader.setRequestHeader( this.requestHeader );
loader.setWithCredentials( this.withCredentials );
loader.load( url, function ( text ) {
try {
onLoad( scope.parse( text ) );
} catch ( e ) {
if ( onError ) {
onError( e );
} else {
console.error( e );
}
scope.manager.itemError( url );
}
}, onProgress, onError );
}
setMaterials( materials ) {
this.materials = materials;
return this;
}
parse( text ) {
const state = new ParserState();
if ( text.indexOf( '\r\n' ) !== - 1 ) {
// This is faster than String.split with regex that splits on both
text = text.replace( /\r\n/g, '\n' );
}
if ( text.indexOf( '\\\n' ) !== - 1 ) {
// join lines separated by a line continuation character (\)
text = text.replace( /\\\n/g, '' );
}
const lines = text.split( '\n' );
let line = '', lineFirstChar = '';
let lineLength = 0;
let result = [];
// Faster to just trim left side of the line. Use if available.
const trimLeft = ( typeof ''.trimLeft === 'function' );
for ( let i = 0, l = lines.length; i < l; i ++ ) {
line = lines[ i ];
line = trimLeft ? line.trimLeft() : line.trim();
lineLength = line.length;
if ( lineLength === 0 ) continue;
lineFirstChar = line.charAt( 0 );
// @todo invoke passed in handler if any
if ( lineFirstChar === '#' ) continue;
if ( lineFirstChar === 'v' ) {
const data = line.split( /\s+/ );
switch ( data[ 0 ] ) {
case 'v':
state.vertices.push(
parseFloat( data[ 1 ] ),
parseFloat( data[ 2 ] ),
parseFloat( data[ 3 ] )
);
if ( data.length >= 7 ) {
state.colors.push(
parseFloat( data[ 4 ] ),
parseFloat( data[ 5 ] ),
parseFloat( data[ 6 ] )
);
} else {
// if no colors are defined, add placeholders so color and vertex indices match
state.colors.push( undefined, undefined, undefined );
}
break;
case 'vn':
state.normals.push(
parseFloat( data[ 1 ] ),
parseFloat( data[ 2 ] ),
parseFloat( data[ 3 ] )
);
break;
case 'vt':
state.uvs.push(
parseFloat( data[ 1 ] ),
parseFloat( data[ 2 ] )
);
break;
}
} else if ( lineFirstChar === 'f' ) {
const lineData = line.substr( 1 ).trim();
const vertexData = lineData.split( /\s+/ );
const faceVertices = [];
// Parse the face vertex data into an easy to work with format
for ( let j = 0, jl = vertexData.length; j < jl; j ++ ) {
const vertex = vertexData[ j ];
if ( vertex.length > 0 ) {
const vertexParts = vertex.split( '/' );
faceVertices.push( vertexParts );
}
}
// Draw an edge between the first vertex and all subsequent vertices to form an n-gon
const v1 = faceVertices[ 0 ];
for ( let j = 1, jl = faceVertices.length - 1; j < jl; j ++ ) {
const v2 = faceVertices[ j ];
const v3 = faceVertices[ j + 1 ];
state.addFace(
v1[ 0 ], v2[ 0 ], v3[ 0 ],
v1[ 1 ], v2[ 1 ], v3[ 1 ],
v1[ 2 ], v2[ 2 ], v3[ 2 ]
);
}
} else if ( lineFirstChar === 'l' ) {
const lineParts = line.substring( 1 ).trim().split( ' ' );
let lineVertices = [];
const lineUVs = [];
if ( line.indexOf( '/' ) === - 1 ) {
lineVertices = lineParts;
} else {
for ( let li = 0, llen = lineParts.length; li < llen; li ++ ) {
const parts = lineParts[ li ].split( '/' );
if ( parts[ 0 ] !== '' ) lineVertices.push( parts[ 0 ] );
if ( parts[ 1 ] !== '' ) lineUVs.push( parts[ 1 ] );
}
}
state.addLineGeometry( lineVertices, lineUVs );
} else if ( lineFirstChar === 'p' ) {
const lineData = line.substr( 1 ).trim();
const pointData = lineData.split( ' ' );
state.addPointGeometry( pointData );
} else if ( ( result = _object_pattern.exec( line ) ) !== null ) {
// o object_name
// or
// g group_name
// WORKAROUND: https://bugs.chromium.org/p/v8/issues/detail?id=2869
// let name = result[ 0 ].substr( 1 ).trim();
const name = ( ' ' + result[ 0 ].substr( 1 ).trim() ).substr( 1 );
state.startObject( name );
} else if ( _material_use_pattern.test( line ) ) {
// material
state.object.startMaterial( line.substring( 7 ).trim(), state.materialLibraries );
} else if ( _material_library_pattern.test( line ) ) {
// mtl file
state.materialLibraries.push( line.substring( 7 ).trim() );
} else if ( _map_use_pattern.test( line ) ) {
// the line is parsed but ignored since the loader assumes textures are defined MTL files
// (according to https://www.okino.com/conv/imp_wave.htm, 'usemap' is the old-style Wavefront texture reference method)
console.warn( 'THREE.OBJLoader: Rendering identifier "usemap" not supported. Textures must be defined in MTL files.' );
} else if ( lineFirstChar === 's' ) {
result = line.split( ' ' );
// smooth shading
// @todo Handle files that have varying smooth values for a set of faces inside one geometry,
// but does not define a usemtl for each face set.
// This should be detected and a dummy material created (later MultiMaterial and geometry groups).
// This requires some care to not create extra material on each smooth value for "normal" obj files.
// where explicit usemtl defines geometry groups.
// Example asset: examples/models/obj/cerberus/Cerberus.obj
/*
* http://paulbourke.net/dataformats/obj/
* or
* http://www.cs.utah.edu/~boulos/cs3505/obj_spec.pdf
*
* From chapter "Grouping" Syntax explanation "s group_number":
* "group_number is the smoothing group number. To turn off smoothing groups, use a value of 0 or off.
* Polygonal elements use group numbers to put elements in different smoothing groups. For free-form
* surfaces, smoothing groups are either turned on or off; there is no difference between values greater
* than 0."
*/
if ( result.length > 1 ) {
const value = result[ 1 ].trim().toLowerCase();
state.object.smooth = ( value !== '0' && value !== 'off' );
} else {
// ZBrush can produce "s" lines #11707
state.object.smooth = true;
}
const material = state.object.currentMaterial();
if ( material ) material.smooth = state.object.smooth;
} else {
// Handle null terminated files without exception
if ( line === '\0' ) continue;
console.warn( 'THREE.OBJLoader: Unexpected line: "' + line + '"' );
}
}
state.finalize();
const container = new Group();
container.materialLibraries = [].concat( state.materialLibraries );
const hasPrimitives = ! ( state.objects.length === 1 && state.objects[ 0 ].geometry.vertices.length === 0 );
if ( hasPrimitives === true ) {
for ( let i = 0, l = state.objects.length; i < l; i ++ ) {
const object = state.objects[ i ];
const geometry = object.geometry;
const materials = object.materials;
const isLine = ( geometry.type === 'Line' );
const isPoints = ( geometry.type === 'Points' );
let hasVertexColors = false;
// Skip o/g line declarations that did not follow with any faces
if ( geometry.vertices.length === 0 ) continue;
const buffergeometry = new BufferGeometry();
buffergeometry.setAttribute( 'position', new Float32BufferAttribute( geometry.vertices, 3 ) );
if ( geometry.normals.length > 0 ) {
buffergeometry.setAttribute( 'normal', new Float32BufferAttribute( geometry.normals, 3 ) );
}
if ( geometry.colors.length > 0 ) {
hasVertexColors = true;
buffergeometry.setAttribute( 'color', new Float32BufferAttribute( geometry.colors, 3 ) );
}
if ( geometry.hasUVIndices === true ) {
buffergeometry.setAttribute( 'uv', new Float32BufferAttribute( geometry.uvs, 2 ) );
}
// Create materials
const createdMaterials = [];
for ( let mi = 0, miLen = materials.length; mi < miLen; mi ++ ) {
const sourceMaterial = materials[ mi ];
const materialHash = sourceMaterial.name + '_' + sourceMaterial.smooth + '_' + hasVertexColors;
let material = state.materials[ materialHash ];
if ( this.materials !== null ) {
material = this.materials.create( sourceMaterial.name );
// mtl etc. loaders probably can't create line materials correctly, copy properties to a line material.
if ( isLine && material && ! ( material instanceof LineBasicMaterial ) ) {
const materialLine = new LineBasicMaterial();
Material.prototype.copy.call( materialLine, material );
materialLine.color.copy( material.color );
material = materialLine;
} else if ( isPoints && material && ! ( material instanceof PointsMaterial ) ) {
const materialPoints = new PointsMaterial( { size: 10, sizeAttenuation: false } );
Material.prototype.copy.call( materialPoints, material );
materialPoints.color.copy( material.color );
materialPoints.map = material.map;
material = materialPoints;
}
}
if ( material === undefined ) {
if ( isLine ) {
material = new LineBasicMaterial();
} else if ( isPoints ) {
material = new PointsMaterial( { size: 1, sizeAttenuation: false } );
} else {
material = new MeshPhongMaterial();
}
material.name = sourceMaterial.name;
material.flatShading = sourceMaterial.smooth ? false : true;
material.vertexColors = hasVertexColors;
state.materials[ materialHash ] = material;
}
createdMaterials.push( material );
}
// Create mesh
let mesh;
if ( createdMaterials.length > 1 ) {
for ( let mi = 0, miLen = materials.length; mi < miLen; mi ++ ) {
const sourceMaterial = materials[ mi ];
buffergeometry.addGroup( sourceMaterial.groupStart, sourceMaterial.groupCount, mi );
}
if ( isLine ) {
mesh = new LineSegments( buffergeometry, createdMaterials );
} else if ( isPoints ) {
mesh = new Points( buffergeometry, createdMaterials );
} else {
mesh = new Mesh( buffergeometry, createdMaterials );
}
} else {
if ( isLine ) {
mesh = new LineSegments( buffergeometry, createdMaterials[ 0 ] );
} else if ( isPoints ) {
mesh = new Points( buffergeometry, createdMaterials[ 0 ] );
} else {
mesh = new Mesh( buffergeometry, createdMaterials[ 0 ] );
}
}
mesh.name = object.name;
container.add( mesh );
}
} else {
// if there is only the default parser state object with no geometry data, interpret data as point cloud
if ( state.vertices.length > 0 ) {
const material = new PointsMaterial( { size: 1, sizeAttenuation: false } );
const buffergeometry = new BufferGeometry();
buffergeometry.setAttribute( 'position', new Float32BufferAttribute( state.vertices, 3 ) );
if ( state.colors.length > 0 && state.colors[ 0 ] !== undefined ) {
buffergeometry.setAttribute( 'color', new Float32BufferAttribute( state.colors, 3 ) );
material.vertexColors = true;
}
const points = new Points( buffergeometry, material );
container.add( points );
}
}
return container;
}
}
export { OBJLoader };

View File

@@ -1,165 +0,0 @@
import * as THREE from 'three';
import { OBJLoader } from './OBJLoader.js';
import VoxelSpace from './solver/VoxelSpace';
import type SomaSolution from "./solver/SomaSolution";
import RotationControl from "./RotationControl";
export default class PolycubeScene {
private renderer: THREE.WebGLRenderer;
private camera: THREE.Camera;
private mainScene: THREE.Scene;
private polycubeMeshes: THREE.Mesh[] = [];
private controls: RotationControl;
private light: THREE.Light;
private lastDims: number = 0;
private lastColor: string = "#FF0000";
private lastPolycube: bigint = 0n;
private cubeMaterial: THREE.MeshPhongMaterial;
private materials: Record<number, THREE.MeshPhongMaterial> = {};
private cubeGeometry: THREE.BufferGeometry;
private cubeScene: THREE.Scene;
constructor(el: HTMLCanvasElement, onReady: () => any, onError: (err: Error) => any) {
this.init(el).then(onReady).catch(onError);
}
private async init(el: HTMLCanvasElement) {
this.renderer = new THREE.WebGLRenderer({canvas: el});
this.setupCamera(el.clientWidth / el.clientHeight);
this.setupLight();
try {
await this.createCubeGeometry();
} catch (err) {
throw new Error(err);
}
this.createCubeMaterial("red");
this.mainScene = new THREE.Scene();
this.cubeScene = new THREE.Scene();
this.mainScene.add(this.cubeScene, this.camera);
this.camera.add(this.light);
this.cubeScene.rotateX(Math.PI/4);
this.cubeScene.rotateY(Math.PI/4);
this.controls = new RotationControl(this.cubeScene, this.camera, el);
requestAnimationFrame((timestamp) => this.render(timestamp));
}
private setupCamera(aspect: number) {
const fov = 60;
const near = 0.1;
const far = 15;
this.camera = new THREE.PerspectiveCamera(fov, aspect, near, far);
this.camera.position.z = 6;
this.camera.lookAt(0, 0, 0);
}
private setPolycube(polycube: bigint, dims: number, color: string) {
if (dims !== this.lastDims) {
this.updateCubesFromDims(dims);
}
if (polycube !== this.lastPolycube) {
let i = 0;
const voxelSpace = new VoxelSpace(0, [dims, dims, dims], polycube, true);
const newDims = voxelSpace.getDims();
this.polycubeMeshes.forEach(mesh => {
mesh.position.set(1000, 1000, 1000);
mesh.material = this.cubeMaterial;
});
voxelSpace.forEachCell((val: boolean, x: number, y: number, z: number) => {
if (val) {
this.polycubeMeshes[i].position.set(
-((newDims[2] - 1)/2) + z,
((newDims[0] - 1)/2) - x,
-((newDims[1] - 1)/2) + y,
);
}
i++;
});
this.lastPolycube = polycube;
}
if (color !== this.lastColor) {
this.cubeMaterial.color.set(color);
this.lastColor = color;
}
}
private updateCubesFromDims(newDims: number) {
const requiredCubes = newDims**3;
if (this.polycubeMeshes.length < requiredCubes) {
for (let i = this.polycubeMeshes.length; i < requiredCubes; i++) {
const newCube = new THREE.Mesh(this.cubeGeometry, this.cubeMaterial);
this.cubeScene.add(newCube);
this.polycubeMeshes.push(newCube);
}
}
if (newDims < this.lastDims || this.lastDims === 0) {
this.polycubeMeshes.forEach(mesh => mesh.position.set(1000, 1000, 1000));
}
this.lastDims = newDims;
}
private setSolution(solution: SomaSolution, colorMap: Record<number, string>) {
const dims = solution.getDims();
if (dims[0] !== this.lastDims) {
this.updateCubesFromDims(dims[0]);
}
let i = 0;
this.polycubeMeshes.forEach(mesh => mesh.position.set(1000, 1000, 1000));
Object.keys(colorMap).forEach(key => {
if (!this.materials[key]) {
this.materials[key] = this.newCubeMaterial(colorMap[key]);
}
})
solution.forEachCell((val: number, x: number, y: number, z: number) => {
this.polycubeMeshes[i].position.set(
-((dims[2] - 1)/2) + z,
((dims[0] - 1)/2) - x,
-((dims[1] - 1)/2) + y,
);
this.polycubeMeshes[i].material = this.materials[val];
i++;
});
}
private setupLight() {
const color = 0xFFFFFF;
const intensity = 1;
this.light = new THREE.DirectionalLight(color, intensity);
this.light.position.set(-1, 2, 4);
}
private render(time: number) {
this.renderer.render(this.mainScene, this.camera);
requestAnimationFrame((time: number) => this.render(time));
}
private async createCubeGeometry(): Promise<void> {
const onLoaded = (obj: THREE.Mesh, resolve: () => any) => {
this.cubeGeometry = (obj.children[0] as THREE.Mesh).geometry;
this.cubeGeometry.computeVertexNormals();
this.cubeGeometry.computeBoundingSphere();
this.cubeGeometry.scale(1/this.cubeGeometry.boundingSphere.radius, 1/this.cubeGeometry.boundingSphere.radius, 1/this.cubeGeometry.boundingSphere.radius);
resolve();
};
const load = (resolve: () => any, reject: (err: string) => any) => {
const loader = new OBJLoader();
loader.load(
'../resources/bevel_cube.obj',
obj => onLoaded(obj, resolve),
() => {},
(err) => reject(`Error loading OBJ file: ${err}`),
);
};
return new Promise<void>(load);
}
private newCubeMaterial(color: string) {
return new THREE.MeshPhongMaterial({color});
}
private createCubeMaterial(color: string) {
this.cubeMaterial = this.newCubeMaterial(color);
}
}

View File

@@ -1,70 +0,0 @@
<script lang="ts">
import {isMaxDimension, isMinDimension, isMaxPolycubes, isMinPolycubes, somaDimension, polycubes, solutions} from "./store";
import SomaSolution from "./solver/SomaSolution";
import SolutionList from "./SolutionList.svelte";
import VoxelSpace from "./solver/VoxelSpace";
$: numCubes = $polycubes.length;
$: cubes = $polycubes;
let consoleOutput = "Press the solve button!";
let solving = false;
function solve() {
consoleOutput = "Solving\n";
const polycubes = cubes.map(cubeInput => cubeInput.rep);
const worker = new Worker('../solver/main.js', {type: "module"});
solving = true;
worker.addEventListener('message', (event) => {
solutions.set(event.data.map(solnData => {
const solution = new SomaSolution(solnData.dim);
solnData.solutionSpaces.forEach((voxelSpace, i) => solution.addSpace(new VoxelSpace(i, [solnData.dim, solnData.dim, solnData.dim], voxelSpace.space)));
return solution;
}));
solving = false;
});
worker.postMessage({polycubes, dims: $somaDimension});
}
</script>
<div class="container">
<h1>Somaesque</h1>
<h3>Settings</h3>
<div class="option">
<p>Cube Dimension: {$somaDimension}</p>
<button on:click={somaDimension.dec} disabled={$isMinDimension}>-</button>
<button on:click={somaDimension.inc} disabled={$isMaxDimension}>+</button>
</div>
<div class="option">
<p>Cubes: {numCubes}</p>
<button on:click={polycubes.removeCube} disabled={$isMinPolycubes}>-</button>
<button on:click={polycubes.addCube} disabled={$isMaxPolycubes}>+</button>
</div>
<div class="option">
<button on:click={solve}>{solving ? 'Solving...' : 'Solve'}</button>
</div>
<SolutionList/>
</div>
<style>
p {
display: inline-block;
}
button {
display: inline-block;
}
.container {
height: 100%;
background-color: #333333;
padding: 1em;
}
h1 {
margin: 0;
color: #ff3e00;
font-size: 3em;
font-weight: 100;
}
</style>

View File

@@ -1,33 +0,0 @@
<script lang="ts">
import {polycubes} from "./store";
import CubeInput from "./CubeInput.svelte";
import Polycube3D from "./Polycube3D.svelte";
$: numCubes = $polycubes.length;
</script>
<div class="input-container">
{#each {length: numCubes} as _, cubeNo}
<div class="cube-input">
<CubeInput
cubeNo={cubeNo}
/>
</div>
{/each}
</div>
<div class="threedee">
<Polycube3D/>
</div>
<style>
.threedee {
text-align: center;
}
.cube-input {
}
.input-container {
padding: 1em;
display: flex;
justify-content: space-around;
flex-flow: row wrap;
}
</style>

View File

@@ -1,30 +0,0 @@
<script lang="ts">
import {solutions, activeSolution, showingSolution} from "./store";
function selectSolution(i: number) {
activeSolution.set(i);
showingSolution.set(true);
}
</script>
<h3>Solutions: {$solutions.length}</h3>
<ul>
{#each $solutions as soln, i}
<li class:active={$activeSolution === i} on:click={() => selectSolution(i)}>
Solution #{i + 1}
</li>
{/each}
</ul>
<style>
li:hover:not(.active) {
background-color: #666666;
}
li {
transition: background-color 200ms;
cursor: pointer;
}
.active {
background-color: #ff3e00;
}
</style>

View File

@@ -18,7 +18,7 @@ export default class SomaSolution {
const uniqueSolns = [solutions[0]];
for (const solution of solutions) {
let foundMatch = false;
for (const rotation of solution.getUniqueRotations()) {
for (const rotation of solution.getRotations()) {
let end = uniqueSolns.length;
for (let i = 0; i < end; i++) {
if (rotation.matches(uniqueSolns[i])) {
@@ -33,7 +33,7 @@ export default class SomaSolution {
return uniqueSolns;
}
getUniqueRotations(): SomaSolution[] {
getRotations(): SomaSolution[] {
if (this.solutionSpaces.length === 0) {
return [];
}
@@ -110,4 +110,8 @@ export default class SomaSolution {
}
}
}
getPieces() {
return this.solutionSpaces.slice();
}
}

View File

@@ -1,5 +1,14 @@
export type DimensionDef = [number, number, number];
const enum NeighbourDirection {
POSX,
POSY,
POSZ,
NEGX,
NEGY,
NEGZ,
}
export default class VoxelSpace {
private dims: DimensionDef;
private length: number;
@@ -299,4 +308,27 @@ export default class VoxelSpace {
});
return size;
}
getDirectNeighbourProfile(x: number, y: number, z: number): number {
let result = 0;
if (x < this.dims[0] - 1 && this.at(x + 1, y, z)) {
result += 1;
}
if (y < this.dims[1] - 1 && this.at(x, y + 1, z)) {
result += 2;
}
if (z < this.dims[2] - 1 && this.at(x, y, z + 1)) {
result += 4;
}
if (x > 0 && this.at(x - 1, y, z)) {
result += 8;
}
if (y > 0 && this.at(x, y - 1, z)) {
result += 16;
}
if (z > 0 && this.at(x, y, z - 1)) {
result += 32;
}
return result;
}
}

View File

@@ -1,4 +1,4 @@
import App from './App.svelte';
import App from './ui/App.svelte';
const app = new App({
target: document.body,

20
src/solver/asconfig.json Normal file
View File

@@ -0,0 +1,20 @@
{
"targets": {
"debug": {
"binaryFile": "build/untouched.wasm",
"textFile": "build/untouched.wat",
"sourceMap": true,
"debug": true
},
"release": {
"binaryFile": "../../public/solver/main.wasm",
"textFile": "../../public/solver/main.wat",
"sourceMap": false,
"optimizeLevel": 3,
"shrinkLevel": 1,
"converge": true,
"noAssert": true
}
},
"options": {}
}

View File

@@ -0,0 +1,89 @@
import VoxelSpace from "./VoxelSpace";
export default class SomaSolution {
private solutionSpaces: VoxelSpace[];
private dim: i32;
constructor(dim: i32) {
if (dim < 0 || dim % 1 !== 0) {
throw new Error("Dimension must be a whole positive integer!");
}
this.dim = dim;
this.solutionSpaces = [];
}
static filterUnique(solutions: SomaSolution[]): SomaSolution[] {
const uniqueSolns = new Array<SomaSolution>();
if (solutions.length == 0) {
return uniqueSolns;
}
uniqueSolns.push(solutions[0]);
for (let iSoln = 0; iSoln < solutions.length; iSoln++) {
const rots = solutions[iSoln].getRotations();
let foundMatch = false;
for (let iRot = 0; iRot < rots.length; iRot++) {
let end = uniqueSolns.length;
for (let i = 0; i < end; i++) {
if (rots[iRot].matches(uniqueSolns[i])) {
foundMatch = true;
}
}
}
if (!foundMatch) {
uniqueSolns.push(solutions[iSoln]);
}
}
return uniqueSolns;
}
getRotations(): SomaSolution[] {
const result: SomaSolution[] = new Array<SomaSolution>();
if (this.solutionSpaces.length == 0) {
return result;
}
const allRots: VoxelSpace[][] = this.solutionSpaces.map<VoxelSpace[]>(space => space.getAllRotations());
for (let i = 0; i < allRots[0].length; i++) {
const solnRot = new SomaSolution(this.dim);
for (let j = 0; j < allRots.length; j++) {
solnRot.addSpace(allRots[j][i]);
}
result.push(solnRot);
}
return result;
}
matches(solution: SomaSolution): boolean {
for (let i = 0; i < this.solutionSpaces.length; i++) {
if (!this.solutionSpaces[i].matches(solution.solutionSpaces[i])) {
return false;
}
}
return true;
}
addSpace(space: VoxelSpace): void {
this.solutionSpaces.push(space);
}
at(x: i32, y: i32, z: i32): i32 {
for (let i = 0; i < this.solutionSpaces.length; i++) {
if (this.solutionSpaces[i].at(x, y, z)) {
return this.solutionSpaces[i].getId();
}
}
return 0;
}
clone(): SomaSolution {
const clone = new SomaSolution(this.dim);
clone.solutionSpaces = this.solutionSpaces.slice(0, this.solutionSpaces.length);
return clone;
}
getDims(): i32[] {
return [this.dim, this.dim, this.dim];
}
getPieces(): VoxelSpace[] {
return this.solutionSpaces;
}
}

View File

@@ -0,0 +1,58 @@
import VoxelSpace from "./VoxelSpace";
import SomaSolution from "./SomaSolution";
export default class SomaSolver {
private solutionCube: VoxelSpace;
private dim: i32;
private solutions: SomaSolution[] = new Array<SomaSolution>();
private iterations: i32 = 0;
constructor(dimension: i32) {
if (dimension % 1 !== 0 || dimension < 0) {
throw new Error("The argument 'dimension' must be a positive whole number");
}
this.dim = dimension;
this.solutionCube = new VoxelSpace(0, dimension, dimension, dimension, 0);
}
solve(polycubes: VoxelSpace[]): void {
if (polycubes.length === 0) {
throw new Error("You must pass at least one polycube to solve the puzzle.");
}
let cumulativeSize = polycubes.reduce((prev, curr) => prev + curr.size(), 0);
if (cumulativeSize !== this.dim**3) {
throw new Error(`The polycubes passed do not add up to exactly enough units to form a cube of dimension ${this.dim}! Got: ${cumulativeSize}, need: ${this.dim**3}`);
}
this.solutions.splice(0, this.solutions.length);
const combosWithRots: VoxelSpace[][] = new Array<Array<VoxelSpace>>();
for (let i = 1; i < polycubes.length; i++) {
combosWithRots.push(polycubes[i].getAllPermutationsInCubeOfSize(this.dim));
}
let combos: VoxelSpace[][] = new Array<Array<VoxelSpace>>();
combos.push(polycubes[0].getAllPositionsInCube(this.dim));
combos = combos.concat(combosWithRots);
this.backtrackSolve(this.solutionCube, combos, new SomaSolution(this.dim));
this.solutions = SomaSolution.filterUnique(this.solutions);
}
getSolutions(): SomaSolution[] {
return this.solutions.slice(0, this.solutions.length);
}
private backtrackSolve(workingSolution: VoxelSpace, polycubes: VoxelSpace[][], currentSoln: SomaSolution, depth: i32 = 0): void {
const nextCubeGroup = polycubes[0];
for (let i = 0; i < nextCubeGroup.length; i++) {
const fusionAttempt = workingSolution.plus(nextCubeGroup[i]);
if (fusionAttempt) {
const nextSoln = currentSoln.clone();
nextSoln.addSpace(nextCubeGroup[i]);
if (polycubes.length == 1) {
this.solutions.push(nextSoln);
currentSoln = new SomaSolution(this.dim);
return;
} else {
this.backtrackSolve(fusionAttempt, polycubes.slice(1), nextSoln, depth + 1);
}
}
}
}
}

View File

@@ -0,0 +1,327 @@
class Extrema {
constructor(
public xMax: i32,
public xMin: i32,
public yMax: i32,
public yMin: i32,
public zMax: i32,
public zMin: i32,
) {}
}
export default class VoxelSpace {
private length: i32;
private space: i64;
private id: i32;
private dimx: i32;
private dimy: i32;
private dimz: i32;
constructor(id: i32, dimx: i32, dimy: i32, dimz: i32, space: i64 = 0, cullEmpty: boolean = false) {
if (!space) {
space = 0;
}
this.id = id;
this.length = dimx * dimy * dimz;
this.dimx = dimx;
this.dimy = dimy;
this.dimz = dimz;
this.space = space;
if (cullEmpty) {
this.cullEmptySpace();
}
}
getExtrema(): Extrema {
const extrema = new Extrema(
0,
i32.MAX_VALUE,
0,
i32.MAX_VALUE,
0,
i32.MAX_VALUE,
);
for (let x = 0; x < this.dimx; x++) {
for (let y = 0; y < this.dimy; y++) {
for (let z = 0; z < this.dimz; z++) {
const val = this.at(x, y, z);
if (val) {
extrema.xMax = Math.max(extrema.xMax, x) as i32;
extrema.xMin = Math.min(extrema.xMin, x) as i32;
extrema.yMax = Math.max(extrema.yMax, y) as i32;
extrema.yMin = Math.min(extrema.yMin, y) as i32;
extrema.zMax = Math.max(extrema.zMax, z) as i32;
extrema.zMin = Math.min(extrema.zMin, z) as i32;
}
}
}
}
return extrema;
}
private cullEmptySpace(): void {
const extrema = this.getExtrema();
let index = 0;
let newSpace = 0;
for (let x = extrema.xMin; x <= extrema.xMax; x++) {
for (let y = extrema.yMin; y <= extrema.yMax; y++) {
for (let z = extrema.zMin; z <= extrema.zMax; z++) {
if (this.at(x, y, z)) {
newSpace |= 1 << index;
}
index++;
}
}
}
this.dimx = extrema.xMax - extrema.xMin + 1;
this.dimy = extrema.yMax - extrema.yMin + 1;
this.dimz = extrema.zMax - extrema.zMin + 1;
this.space = newSpace;
}
getId(): i32 {
return this.id;
}
getUniqueRotations(): VoxelSpace[] {
const rotations: VoxelSpace[] = new Array<VoxelSpace>();
const refSpace = this.clone();
VoxelSpace.pushNewUniqueSpaces(rotations, refSpace.getXAxisSpins());
refSpace.rot90Y();
VoxelSpace.pushNewUniqueSpaces(rotations, refSpace.getXAxisSpins());
refSpace.rot90Y();
VoxelSpace.pushNewUniqueSpaces(rotations, refSpace.getXAxisSpins());
refSpace.rot90Y();
VoxelSpace.pushNewUniqueSpaces(rotations, refSpace.getXAxisSpins());
refSpace.rot90Z();
VoxelSpace.pushNewUniqueSpaces(rotations, refSpace.getXAxisSpins());
refSpace.rot90Z();
refSpace.rot90Z();
VoxelSpace.pushNewUniqueSpaces(rotations, refSpace.getXAxisSpins());
return rotations;
}
getAllRotations(): VoxelSpace[] {
let rotations: VoxelSpace[] = new Array<VoxelSpace>();
const refSpace = this.clone();
rotations = rotations.concat(refSpace.getXAxisSpins());
refSpace.rot90Y();
rotations = rotations.concat(refSpace.getXAxisSpins());
refSpace.rot90Y();
rotations = rotations.concat(refSpace.getXAxisSpins());
refSpace.rot90Y();
rotations = rotations.concat(refSpace.getXAxisSpins());
refSpace.rot90Z();
rotations = rotations.concat(refSpace.getXAxisSpins());
refSpace.rot90Z();
refSpace.rot90Z();
rotations = rotations.concat(refSpace.getXAxisSpins());
return rotations;
}
protected static pushNewUniqueSpaces(existingSpaces: VoxelSpace[], newSpaces: VoxelSpace[]): void {
for (let iNew = 0; iNew < newSpaces.length; iNew++) {
let matchFound = false;
for (let iExisting = 0; iExisting < existingSpaces.length; iExisting++) {
if (newSpaces[iNew].matches(existingSpaces[iExisting])) {
matchFound = true;
break;
}
}
if (!matchFound) {
existingSpaces.push(newSpaces[iNew]);
}
}
}
getAllPositionsInCube(cubeDim: i32): VoxelSpace[] {
if ((cubeDim > 0) && (cubeDim % 1 == 0)) {
const cubePositions: VoxelSpace[] = [];
for (let x = 0; x < cubeDim - this.dimx + 1; x++) {
for (let y = 0; y < cubeDim - this.dimy + 1; y++) {
for (let z = 0; z < cubeDim - this.dimz + 1; z++) {
const cubePos = new VoxelSpace(this.id, cubeDim, cubeDim, cubeDim);
for (let rotX = 0; rotX < this.dimx; rotX++) {
for (let rotY = 0; rotY < this.dimy; rotY++) {
for (let rotZ = 0; rotZ < this.dimz; rotZ++) {
cubePos.set(x + rotX, y + rotY, z + rotZ, this.at(rotX, rotY, rotZ));
}
}
}
cubePositions.push(cubePos);
}
}
}
return cubePositions;
} else {
throw new Error("cubeDim must be a positive integer.");
}
}
matches(space: VoxelSpace): boolean {
if (space.dimx !== this.dimx) {
return false;
}
if (space.dimy !== this.dimy) {
return false;
}
if (space.dimz !== this.dimz) {
return false;
}
return this.space == space.getRaw();
}
clone(): VoxelSpace {
return new VoxelSpace(this.id, this.dimx, this.dimy, this.dimz, this.getRaw());
}
private getXAxisSpins(): VoxelSpace[] {
const rotations: Array<VoxelSpace> = new Array<VoxelSpace>();
rotations.push(this.clone());
for (let i = 0; i < 3; i++) {
rotations.push(rotations[i].rotated90X());
}
return rotations;
}
getRaw(): i64 {
return this.space;
}
// [1, 0, 0] [x] [ x]
// [0, 0, -1] * [y] = [-z]
// [0, 1, 0] [z] [ y]
private newIndexRotX(x: i32, y: i32, z: i32): i32 {
return this.dimz * this.dimy * x + this.dimy * (this.dimz - 1 - z) + y;
}
// [ 0, 0, 1] [x] [ z]
// [ 0, 1, 0] * [y] = [ y]
// [-1, 0, 0] [z] [-x]
private newIndexRotY(x: i32, y: i32, z: i32): i32 {
return this.dimy * this.dimx * z + this.dimx * y + (this.dimx - 1 - x);
}
// [0, -1, 0] [x] [-y]
// [1, 0, 0] * [y] = [ x]
// [0, 0, 1] [z] [ z]
private newIndexRotZ(x: i32, y: i32, z: i32): i32 {
return this.dimx * this.dimz * (this.dimy - 1 - y) + this.dimz * x + z;
}
at(x: i32, y: i32, z: i32): boolean {
const mask = 1 << (this.dimy * this.dimz * x + this.dimz * y + z);
return (this.space & mask) !== 0;
}
toggle(x: i32, y: i32, z: i32): void {
const mask = 1 << this.dimy * this.dimz * x + this.dimz * y + z;
this.space ^= mask;
}
set(x: i32, y: i32, z: i32, val: boolean): void {
const mask = 1 << this.dimy * this.dimz * x + this.dimz * y + z;
if (val) {
this.space |= mask;
} else {
this.space &= ~mask;
}
}
rotated90X(): VoxelSpace {
let newSpace = 0;
for (let x = 0; x < this.dimx; x++) {
for (let y = 0; y < this.dimy; y++) {
for (let z = 0; z < this.dimz; z++) {
if (this.at(x, y, z)) {
newSpace |= 1 << this.newIndexRotX(x, y, z);
}
}
}
}
return new VoxelSpace(this.id, this.dimx, this.dimz, this.dimy, newSpace);
}
rotated90Y(): VoxelSpace {
let newSpace = 0;
for (let x = 0; x < this.dimx; x++) {
for (let y = 0; y < this.dimy; y++) {
for (let z = 0; z < this.dimz; z++) {
if (this.at(x, y, z)) {
newSpace |= 1 << this.newIndexRotY(x, y, z);
}
}
}
}
return new VoxelSpace(this.id, this.dimz, this.dimy, this.dimx, newSpace);
}
rotated90Z(): VoxelSpace {
let newSpace = 0;
for (let x = 0; x < this.dimx; x++) {
for (let y = 0; y < this.dimy; y++) {
for (let z = 0; z < this.dimz; z++) {
if (this.at(x, y, z)) {
newSpace |= 1 << this.newIndexRotZ(x, y, z);
}
}
}
}
return new VoxelSpace(this.id, this.dimy, this.dimx, this.dimz, newSpace);
}
rot90X(): void {
const rot = this.rotated90X();
this.space = rot.getRaw();
this.dimx = rot.dimx;
this.dimy = rot.dimy;
this.dimz = rot.dimz;
}
rot90Y(): void {
const rot = this.rotated90Y();
this.space = rot.getRaw();
this.dimx = rot.dimx;
this.dimy = rot.dimy;
this.dimz = rot.dimz;
}
rot90Z(): void {
const rot = this.rotated90Z();
this.space = rot.getRaw();
this.dimx = rot.dimx;
this.dimy = rot.dimy;
this.dimz = rot.dimz;
}
plus(space: VoxelSpace): VoxelSpace | null {
const otherSpace = space.getRaw();
if ((this.space | otherSpace) == (this.space ^ otherSpace)) {
return new VoxelSpace(this.id, this.dimx, this.dimy, this.dimz, otherSpace | this.space);
}
return null;
}
size(): i32 {
let size = 0;
for (let x = 0; x < this.dimx; x++) {
for (let y = 0; y < this.dimy; y++) {
for (let z = 0; z < this.dimz; z++) {
if (this.at(x, y, z)) {
size++;
}
}
}
}
return size;
}
getAllPermutationsInCubeOfSize(dim: i32): VoxelSpace[] {
const rotations = this.getUniqueRotations();
let result = new Array<VoxelSpace>();
for (let i = 0; i < rotations.length; i++) {
result = result.concat(rotations[i].getAllPositionsInCube(dim));
}
return result;
}
}

View File

@@ -0,0 +1,22 @@
import SomaSolver from "./SomaSolver";
import VoxelSpace from "./VoxelSpace";
export function solve(polycubes: Array<i64>, dim: i32): Int64Array[] {
const solver = new SomaSolver(dim);
const voxelSpaces = new Array<VoxelSpace>();
for (let i = 0; i < polycubes.length; i++) {
voxelSpaces.push(new VoxelSpace(i, dim, dim, dim, polycubes[i], true));
}
solver.solve(voxelSpaces);
const solutions = solver.getSolutions();
let output: Int64Array[] = new Array<Int64Array>();
for (let i = 0; i < solutions.length; i++) {
const pieces = solutions[i].getPieces();
output.push(new Int64Array(pieces.length));
for (let j = 0; j < pieces.length; j++) {
output[i][j] = pieces[j].getRaw();
}
}
return output;
}

View File

@@ -0,0 +1,6 @@
{
"extends": "assemblyscript/std/assembly.json",
"include": [
"./**/*.ts"
]
}

13
src/solver/index.js Normal file
View File

@@ -0,0 +1,13 @@
const AsBind = require("as-bind/dist/as-bind.cjs.js");
const fs = require("fs");
const wasm = fs.readFileSync("./build/untouched.wasm");
const asyncTask = async () => {
const asBindInstance = await AsBind.instantiate(wasm);
// You can now use your wasm / as-bind instance!
const response = asBindInstance.exports.solve(
[16875584n, 16810176n, 65688n, 77952n, 12296n, 2109456n, 4184n], 3
);
console.log(response); // AsBind: Hello World!
};
asyncTask();

View File

@@ -1,12 +0,0 @@
import SomaSolver from "./SomaSolver";
import VoxelSpace from "./VoxelSpace";
type SolveStartMessageData = {polycubes: bigint[], dims: number};
self.addEventListener('message', (event) => {
const {polycubes, dims} = event.data as SolveStartMessageData;
const solver = new SomaSolver(event.data.dims);
solver.solve(polycubes.map((cubeRep, i) => new VoxelSpace(i, [dims, dims, dims], cubeRep)));
(self as unknown as Worker).postMessage(solver.getSolutions());
});

60
src/solver/package-lock.json generated Normal file
View File

@@ -0,0 +1,60 @@
{
"requires": true,
"lockfileVersion": 1,
"dependencies": {
"@assemblyscript/loader": {
"version": "0.19.1",
"resolved": "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.19.1.tgz",
"integrity": "sha512-3vpqYxOY7o8SNj2riGNF3wSZsqWippWTs7YwyTPPyxvjbrT1ZJnMMoGm4HSpbZ0QmKphzsaM4trR+BtxLFynDA=="
},
"as-bind": {
"version": "0.7.1",
"resolved": "https://registry.npmjs.org/as-bind/-/as-bind-0.7.1.tgz",
"integrity": "sha512-x/tfZZcyObwvAohhVYaKqLSvroMHqop3l9gkUO5JM0bBEdhI3BWXjkG3DZIuWj0YFzhQ8OiWG3FCvQQq/5yB3A==",
"requires": {
"visitor-as": "^0.5.0"
}
},
"assemblyscript": {
"version": "0.19.1",
"resolved": "https://registry.npmjs.org/assemblyscript/-/assemblyscript-0.19.1.tgz",
"integrity": "sha512-unWcmJsw5H0H2GrTf25GlDJCaNzAveeFYPH5XhP54m540+26KJIurTEHN+xf/EI3MdK7IhThpGCE+pNqiNuLmA==",
"dev": true,
"requires": {
"binaryen": "101.0.0-nightly.20210527",
"long": "^4.0.0"
}
},
"binaryen": {
"version": "101.0.0-nightly.20210527",
"resolved": "https://registry.npmjs.org/binaryen/-/binaryen-101.0.0-nightly.20210527.tgz",
"integrity": "sha512-dbKentJwA6H0LfI+pRuzNNzAooJwYFNrg1L8rRw8j6rlfkU815ytNLO+uDzGNcltYehUa5ERZFJHPIdqX12n0w==",
"dev": true
},
"lodash.clonedeep": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
"integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8="
},
"long": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz",
"integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==",
"dev": true
},
"ts-mixer": {
"version": "5.4.1",
"resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-5.4.1.tgz",
"integrity": "sha512-Zo9HgPCtNouDgJ+LGtrzVOjSg8+7WGQktIKLwAfaNrlOK1mWGlz1ejsAF/YqUEqAGjUTeB5fEg8gH9Aui6w9xA=="
},
"visitor-as": {
"version": "0.5.0",
"resolved": "https://registry.npmjs.org/visitor-as/-/visitor-as-0.5.0.tgz",
"integrity": "sha512-U2P13pa7BAnfj6IEbP4feS1Rci6NT4GlDcwpqkk90u7LGalc5jH9aMuWnxTC8RJJ92iZzDQ8Lea5/OnLDsgzlw==",
"requires": {
"lodash.clonedeep": "^4.5.0",
"ts-mixer": "^5.1.0"
}
}
}
}

15
src/solver/package.json Normal file
View File

@@ -0,0 +1,15 @@
{
"scripts": {
"asbuild:untouched": "asc assembly/index.ts --target debug",
"asbuild:optimized": "asc assembly/index.ts --target release",
"asbuild": "npm run asbuild:untouched && npm run asbuild:optimized",
"test": "node tests"
},
"dependencies": {
"@assemblyscript/loader": "^0.19.1",
"as-bind": "^0.7.1"
},
"devDependencies": {
"assemblyscript": "^0.19.1"
}
}

View File

@@ -1,6 +1,6 @@
import { derived, writable } from 'svelte/store';
import { get } from 'svelte/store';
import type SomaSolution from "./solver/SomaSolution";
import type SomaSolution from "./SomaSolution";
type PolycubeInput = {
color: string,
@@ -23,7 +23,7 @@ export const isMaxPolycubes = derived(
([$polycubes, $somaDimension]: [PolycubeInput[], number]) => $polycubes.length >= $somaDimension ** 3);
export const isMinPolycubes = derived(store.polycubes, ($polycubes: PolycubeInput[]) => $polycubes.length <= 1);
export const solutions = writable([] as SomaSolution[]);
export const activeSolution = writable(0);
export const activeSolution = writable<number | null>(null);
export const showingSolution = writable(false);
export const somaDimension = {
@@ -43,6 +43,12 @@ export const somaDimension = {
return dims - 1;
});
}
},
set(dims: number) {
if (dims <= MAX_DIMS && dims >= MIN_DIMS) {
polycubes.reset(dims);
store.somaDimension.set(dims);
}
}
};
@@ -107,5 +113,5 @@ function colorFromIndex(index: number) {
let hue = spacing * (index % 6) + offset;
const saturation = 100;
const lightness = 1 / (2 + darknessCycle) * 100;
return `hsl(${hue},${saturation}%,${lightness}%)`;
return `hsl(${hue},${saturation}%,${Math.round(lightness)}%)`;
}

View File

@@ -1,6 +1,6 @@
<script lang="ts">
import Sidebar from "./Sidebar.svelte";
import SolutionInteractor from "./SolutionInteractor.svelte";
import SolutionInteractor from "./Interactor.svelte";
</script>
<main>

View File

@@ -1,11 +1,11 @@
<script lang="ts">
import {somaDimension, polycubes, selectedCube, showingSolution} from "./store";
import {somaDimension, polycubes, selectedCube, showingSolution} from "../store";
export let cubeNo: number;
$: dimension = $somaDimension;
$: cube = $polycubes[cubeNo];
$: cubeColor = cube.color;
$: currentlyVisualised = $selectedCube === cubeNo;
$: currentlyVisualised = $selectedCube === cubeNo && !$showingSolution;
let cellStartDragInitialVal: boolean = false;
let cellStartDrag: number = 0;
let cellDragStartPos: {x: number, y: number} = {x: 0, y: 0};
@@ -24,6 +24,7 @@
function onMouseOverCell(event: MouseEvent, x: number, y: number, z: number) {
if (event.buttons !== 0) {
polycubes.set(cubeNo, event.buttons === 1, x, y, z);
selectedCube.set(cubeNo);
}
}
@@ -74,10 +75,10 @@
{#each {length: dimension} as _, z}
<div
class="cell"
class:filled={at(cube.rep, x, y, z)}
on:mousemove={(event) => onMouseOverCell(event, x, y, z)}
on:mousedown={(event) => onMouseDownCell(event, x, y, z)}
on:mouseup={(event) => onMouseUpCell(event, x, y, z)}
class:filled={at(cube.rep, z, dimension-1-x, y)}
on:mousemove={(event) => onMouseOverCell(event, z, dimension-1-x, y)}
on:mousedown={(event) => onMouseDownCell(event, z, dimension-1-x, y)}
on:mouseup={(event) => onMouseUpCell(event, z, dimension-1-x, y)}
/>
{/each}
</div>
@@ -90,8 +91,8 @@
* {
--cell-size: 30px;
}
.active {
border: 1px solid red;
.cube.active {
border: 3px solid #ff3e00;
}
h1 {
font-size: 1em;
@@ -103,6 +104,7 @@
}
.cube {
border-radius: 1em;
border: 3px solid transparent;
background-color: #666666;
cursor: pointer;
transition: transform 200ms;

53
src/ui/Interactor.svelte Normal file
View File

@@ -0,0 +1,53 @@
<script lang="ts">
import {polycubes} from "../store";
import CubeInput from "./CubeInput.svelte";
import SolutionViewer from "./SolutionViewer.svelte";
$: numCubes = $polycubes.length;
</script>
<div class="viewport">
<div class="input-container">
{#each {length: numCubes} as _, cubeNo}
<div class="cube-input">
<div class="padder">
<CubeInput
cubeNo={cubeNo}
/>
</div>
</div>
{/each}
</div>
<div class="threedee">
<SolutionViewer/>
</div>
</div>
<style>
.threedee {
flex: 1 1 auto;
display: flex;
flex-direction: column;
align-content: center;
justify-content: center;
text-align: center;
}
.padder {
padding: 1em;
}
.cube-input {
margin: auto;
}
.input-container {
flex: 0 1 fit-content;
overflow-x: scroll;
display: flex;
flex-flow: row;
}
.viewport {
display: flex;
height: 100%;
align-content: center;
justify-content: center;
flex-direction: column;
}
</style>

196
src/ui/Sidebar.svelte Normal file
View File

@@ -0,0 +1,196 @@
<script lang="ts">
import {isMaxPolycubes, isMinPolycubes, somaDimension, polycubes, solutions} from "../store";
import SomaSolution from "../SomaSolution";
import SolutionList from "./SolutionList.svelte";
import VoxelSpace from "../VoxelSpace";
$: numCubes = $polycubes.length;
$: cubes = $polycubes;
let noEmpties: boolean;
let enoughSubcubes: boolean;
let readyToSolve: boolean;
let size: number;
$: {
const dim = $somaDimension as number;
const polycubes: VoxelSpace[] = cubes.map(cubeInput => new VoxelSpace(0, [dim, dim, dim], cubeInput.rep));
size = polycubes.reduce((prev, cube) => cube.size() + prev, 0);
noEmpties = polycubes.reduce((prev, cube) => (cube.size() !== 0) && prev, true);
enoughSubcubes = size === dim**3;
readyToSolve = size === dim**3 && noEmpties;
}
let solving = false;
const worker = new Worker('../solver/main.js', {type: "module"});
async function respondWasm(event: MessageEvent) {
const dim = $somaDimension as number;
solutions.set(event.data.map((wasmSolution) => {
const solnObj = new SomaSolution(dim);
const spaceReps = wasmSolution.split(",");
for (let i = 0; i < spaceReps.length; i++) {
solnObj.addSpace(new VoxelSpace(i, [dim, dim, dim], BigInt(parseInt(spaceReps[i]))));
}
return solnObj;
}));
solving = false;
}
function respondJs(event: MessageEvent) {
solutions.set(event.data.map(solnData => {
const solution = new SomaSolution(solnData.dim);
solnData.solutionSpaces.forEach((voxelSpace, i) => solution.addSpace(new VoxelSpace(i, [solnData.dim, solnData.dim, solnData.dim], voxelSpace.space)));
return solution;
}));
solving = false;
}
function solveJs() {
worker.onmessage = (e) => respondJs(e);
const polycubes = cubes.map(cubeInput => cubeInput.rep);
solving = true;
worker.postMessage({type: 'js', polycubes, dims: $somaDimension});
}
function solveWasm() {
worker.onmessage = (e) => respondWasm(e);
const polycubes = cubes.map(cubeInput => cubeInput.rep);
console.log(polycubes);
solving = true;
worker.postMessage({type: 'wasm', polycubes, dims: $somaDimension});
}
function genTooltip() {
let messages = [];
if (!enoughSubcubes) {
messages.push(`You have not input enough subcubes to form a cube with a side length of ${$somaDimension}. Needed: ${$somaDimension**3}, current: ${size}.`);
}
if (!noEmpties) {
messages.push("You have left some of the polycube inputs empty. Remove them to solve.");
}
return messages.join("\n");
}
</script>
<div class="container">
<h1>Somaesque</h1>
<div class="widgets">
<div class="option">
<p>Dimension:</p>
<div class="choice">
<button
class:selected={$somaDimension === 2}
on:click={() => somaDimension.set(2)}
disabled={$somaDimension === 2}>
2
</button>
<button
class:selected={$somaDimension === 3}
on:click={() => somaDimension.set(3)}
disabled={$somaDimension === 3}>
3
</button>
<button
class:selected={$somaDimension === 4}
on:click={() => somaDimension.set(4)}
disabled={$somaDimension === 4}>
4
</button>
</div>
</div>
<div class="option">
<p>Cubes:</p>
<div class="choice">
<p>{numCubes}</p>
<button on:click={polycubes.removeCube} disabled={$isMinPolycubes}>-</button>
<button on:click={polycubes.addCube} disabled={$isMaxPolycubes}>+</button>
</div>
</div>
<div class="option">
<button
class="solve"
on:click={solveWasm}
title="{genTooltip(enoughSubcubes, noEmpties, size)}"
disabled="{solving || !readyToSolve}">
{solving ? "Solving..." : "Solve!"}
</button>
</div>
</div>
<h3>Solutions: {$solutions.length}</h3>
<SolutionList/>
</div>
<style>
p {
margin: 0;
display: inline-block;
}
.choice {
display: block;
text-align: center;
margin-top: 1em;
}
button {
display: inline-block;
background-color: #999999;
width: 2em;
height: 2em;
border-style: none;
}
.selected:disabled {
color: white;
background-color: #ff3e00;
}
button:hover:not(:disabled) {
cursor: pointer;
background-color: #c1c1c1;
}
button:disabled {
color: #a7a7a7;
background-color: #616161;
}
button.solve {
width: auto;
color: white;
background-color: #ff3e00;
font-size: 2em;
border-radius: 0.5em;
border-style: none;
margin: 0;
}
button.solve:disabled {
width: auto;
color: #999999;
background-color: #a36754;
font-size: 2em;
}
.container {
display: flex;
align-items: center;
flex-direction: column;
height: 100vh;
overflow: hidden;
background-color: #333333;
padding: 1em;
text-align: center;
}
.widgets {
width: 100%;
}
.widgets:first-child {
padding-top: 0;
}
.widgets:last-child {
padding-bottom: 0;
}
.widgets > * {
padding-top: 1em;
padding-bottom: 1em;
}
h1 {
margin: 0;
color: #ff3e00;
font-size: 3em;
font-weight: 100;
}
</style>

91
src/ui/Solution2D.svelte Normal file
View File

@@ -0,0 +1,91 @@
<script lang="ts">
import {polycubes, activeSolution, showingSolution, solutions} from "../store";
import SomaSolution from "../SomaSolution";
$: solutionDisplayed = $solutions[$activeSolution];
$: dimension = (solutionDisplayed && solutionDisplayed.getDims?.()[0]) ?? 3;
function colorAt(soln: SomaSolution, x: number, y: number, z: number) {
return $polycubes[soln.at(z, dimension-1-x, y)].color;
}
</script>
{#if $activeSolution !== null}
<div
class="cube"
class:active={$showingSolution}
style="--dimension: {dimension};"
on:click={() => showingSolution.set(true)}
>
<h1>Solution #{$activeSolution + 1}</h1>
<div class="center">
{#each {length: dimension} as _, x}
<div class="layer">
{#each {length: dimension} as _, y}
<div class="row">
{#each {length: dimension} as _, z}
<div
class="cell"
style="background-color:{colorAt(solutionDisplayed, x, y, z)}; border-color: {colorAt(solutionDisplayed, x, y, z)}"
class:filled={true}
/>
{/each}
</div>
{/each}
</div>
{/each}
</div>
</div>
{/if}
<style>
* {
--cell-size: 30px;
}
.center {
text-align: center;
}
h1 {
font-size: 1em;
text-align: center;
}
.cube.active {
border: 3px solid #ff3e00;
}
.cube:hover:not(.active) {
transform: scale(1.03);
filter: brightness(1.1);
}
.cube {
border-radius: 1em;
border: 3px solid transparent;
background-color: #666666;
cursor: pointer;
transition: transform 200ms;
padding: 1em 2em 1em 2em;
user-select: none;
}
.cell {
box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.5);
text-align: center;
cursor: pointer;
display: inline-block;
border: 1px var(--color) solid;
border-radius: 4px;
height: var(--cell-size);
width: var(--cell-size);
background-color: #aaaaaa;
margin: 1px;
}
.row {
display: flex;
margin: 0;
justify-content: center;
}
.layer {
margin-top: 10px;
}
.filled {
background: var(--color);
}
</style>

View File

@@ -0,0 +1,44 @@
<script lang="ts">
import {solutions, activeSolution, showingSolution} from "../store";
function selectSolution(i: number) {
activeSolution.set(i);
showingSolution.set(true);
}
</script>
<ul>
{#if $solutions.length === 0}
<li>No solutions yet...</li>
{/if}
{#each $solutions as soln, i}
<li class:active={$activeSolution === i} on:click={() => selectSolution(i)}>
Solution #{i + 1}
</li>
{/each}
</ul>
<style>
li:hover:not(.active) {
background-color: #aaaaaa;
}
li {
transition: background-color 100ms;
cursor: pointer;
list-style: none;
height: 2em;
line-height: 2em;
}
ul {
width: 100%;
overflow-y: scroll;
flex: 1;
padding: 0.5em;
margin: 0;
text-align: center;
background-color: #666;
}
.active {
background-color: #ff3e00;
}
</style>

View File

@@ -1,7 +1,8 @@
<script lang="ts">
import PolycubeScene from "./PolycubeScene.ts";
import PolycubeScene from "./threedee/PolycubeScene.ts";
import {onMount} from "svelte";
import {polycubes, somaDimension, selectedCube, solutions, activeSolution, showingSolution} from "./store";
import {polycubes, somaDimension, selectedCube, solutions, activeSolution, showingSolution} from "../store";
import Solution2D from "./Solution2D.svelte";
$: cube = $polycubes[$selectedCube];
$: soln = $solutions[$activeSolution];
@@ -18,22 +19,36 @@
if ($showingSolution) {
const colorMap = {};
$polycubes.forEach((polycube, i) => colorMap[i] = polycube.color);
threeTest?.setSolution(soln, colorMap);
threeTest?.showSolution(soln, colorMap);
} else {
threeTest?.setPolycube(cube.rep, $somaDimension, cube.color);
threeTest?.showPolycube(cube.rep, $somaDimension, cube.color);
}
}
}
</script>
<div class="top">
<div class="soln2d-container">
<Solution2D/>
</div>
<canvas
bind:this={el}
width="640"
height="480"
></canvas>
</div>
<style>
.top {
display: flex;
justify-content: space-evenly;
align-items: center;
}
.soln2d-container {
display: inline-block;
}
canvas {
display: inline-block;
border-radius: 1em;
}
</style>

View File

@@ -0,0 +1,144 @@
import type * as THREE from "three";
import {OBJLoader} from "three/examples/jsm/loaders/OBJLoader";
export enum SomaesqueGeometry {
c000000 = 'c000000',
c000001 = 'c000001',
c000011 = 'c000011',
c000111 = 'c000111',
c001001 = 'c001001',
c001011 = 'c001011',
c001111 = 'c001111',
c011011 = 'c011011',
}
const MESH_ROT_MAP = [
"000000", // 000000
"000001", // 000001
"000001z", // 000010
"000011", // 000011
"000001b", // 000100
"000011x", // 000101
"000011b", // 000110
"000111", // 000111
"000001yy", // 001000
"001001", // 001001
"000011yy", // 001010
"001011", // 001011
"000011zx", // 001100
"001011x", // 001101
"000111y", // 001110
"001111", // 001111
"000001ba", // 010000
"000011xx", // 010001
"001001ya", // 010010
"001011zb", // 010011
"000011yx", // 010100
"000111x", // 010101
"001011zb", // 010110
"001111zb", // 010111
"000011zz", // 011000
"001011xx", // 011001
"001011z", // 011010
"011011", // 011011
"000111yx", // 011100
"001111x", // 011101
"001111yx", // 011110
"011011", // 011111
"000001y", // 100000
"000011a", // 100001
"000011b", // 100010
"000111b", // 100011
"001001b", // 100100
"001011yc", // 100101 //---
"001011b", // 100110
"001111b", // 100111
"000011ccx",// 101000
"001011a", // 101001
"000111bb", // 101010
"001111a", // 101011
"001011yz", // 101100 //---
"011011x", // 101101 //---
"001111y", // 101110 //---
"011011", // 101111
"000011xz", // 110000 //---
"000111ba", // 110001 //---
"001011ba", // 110010 //---
"001111ba", // 110011
"001011bx", // 110100
"001111bx", // 110101
"011011b", // 110110
"011011", // 110111
"000111bba",// 111000
"001111xx", // 111001
"001111ya", // 111010
"011011", // 111011
"001111yz", // 111100
"011011", // 111101
"011011", // 111110
"011011", // 111111
];
const ROT_CODE_MAP = {
x(mesh: THREE.Object3D) { mesh.rotateX(Math.PI/2); },
y(mesh: THREE.Object3D) { mesh.rotateY(Math.PI/2); },
z(mesh: THREE.Object3D) { mesh.rotateZ(Math.PI/2); },
a(mesh: THREE.Object3D) { mesh.rotateX(-Math.PI/2); },
b(mesh: THREE.Object3D) { mesh.rotateY(-Math.PI/2); },
c(mesh: THREE.Object3D) { mesh.rotateZ(-Math.PI/2); },
} as const;
type GeomRecord = Record<SomaesqueGeometry, THREE.BufferGeometry>;
export default class GeometryManager {
private readonly root: string = "";
private geometryRecord: GeomRecord = {} as GeomRecord;
constructor(root: string, onReadyCb: (error?: string) => any) {
this.root = root;
Promise.allSettled(Object.keys(SomaesqueGeometry).map(geomId =>
this.loadCubeGeometry(geomId as SomaesqueGeometry),
)).then(() => onReadyCb()).catch((err) => onReadyCb(err));
}
private async loadCubeGeometry(id: SomaesqueGeometry): Promise<THREE.BufferGeometry> {
const onLoaded = (obj: THREE.Group, resolve: (geom: THREE.BufferGeometry) => any) => {
const geom = (obj.children[0] as THREE.Mesh).geometry;
this.geometryRecord[id] = geom;
resolve(geom);
};
const load = (resolve: (geom: THREE.BufferGeometry) => any, reject: (err: string) => any) => {
const loader = new OBJLoader();
loader.load(
`${this.root}${id}.obj`,
obj => onLoaded(obj, resolve),
() => {},
(err) => reject(`Error loading OBJ file: ${err}`),
);
};
return new Promise(load);
}
retrieve(geometry: SomaesqueGeometry) {
let requestedGeom = this.geometryRecord[geometry];
if (requestedGeom) {
return requestedGeom;
} else {
throw new Error(`Geometry with id: ${geometry} does not exist!`);
}
}
retrieveCubeGeometry(neighbourProfile: number) {
return this.geometryRecord.c000000;
// let requestedGeom = this.geometryRecord[`c${MESH_ROT_MAP[neighbourProfile].substr(0, 6)}`];
// const rotations = MESH_ROT_MAP[neighbourProfile].substr(6);
// if (!requestedGeom) {
// throw new Error(`No similar cube found for the neighbour profile: ${neighbourProfile}`)
// } else if (rotations) {
// requestedGeom = requestedGeom.clone();
// for (let i = 0; i < rotations.length; i++) {
// ROT_CODE_MAP[rotations[i]](requestedGeom);
// }
// }
// return requestedGeom;
}
}

View File

@@ -0,0 +1,91 @@
import * as THREE from "three";
import type VoxelSpace from "../../VoxelSpace";
import type GeometryManager from "./GeometryManager";
export default class PolycubeMesh {
private static geometryManager: GeometryManager;
private group: THREE.Group;
private meshes: THREE.Mesh[] = [];
private currentPolycube: bigint = 0n;
private material: THREE.MeshPhongMaterial;
private numActiveCubes: number = 0;
private flyDirection: THREE.Vector3 = new THREE.Vector3();
constructor(polycube: VoxelSpace, color: string) {
this.material = new THREE.MeshPhongMaterial({color: 'red', shininess: 100, reflectivity: 100});
this.group = new THREE.Group();
this.swapColor(color);
this.swapPolycube(polycube);
}
static setManager(manager: GeometryManager) {
PolycubeMesh.geometryManager = manager;
}
swapColor(color: string) {
this.material.color.set(color);
}
swapPolycube(polycube: VoxelSpace) {
if (polycube.getRaw() === this.currentPolycube) {
return;
}
this.numActiveCubes = polycube.size();
this.meshes = [];
this.group.clear();
this.group.position.set(0, 0, 0);
polycube.forEachCell((val: boolean, x: number, y: number, z: number) => {
if (val) {
this.addCube(polycube, x, y, z);
}
});
this.currentPolycube = polycube.getRaw();
this.flyDirection = this.middlePosOfGroup().normalize();
}
private addCube(refPolycube: VoxelSpace, x: number, y: number, z: number) {
const dims = refPolycube.getDims();
const neighbourProfile = refPolycube.getDirectNeighbourProfile(x, y, z);
const mesh = new THREE.Mesh(
PolycubeMesh.geometryManager.retrieveCubeGeometry(neighbourProfile),
this.material
);
mesh.position.set(
-((dims[0] - 1)/2) + x,
-((dims[1] - 1)/2) + y,
-((dims[2] - 1)/2) + z,
);
this.meshes.push(mesh);
this.group.add(mesh);
}
center() {
const mid = this.middlePosOfGroup();
this.group.children.forEach(child => child.position.sub(mid));
}
private middlePosOfGroup() {
return this.group.children.reduce(
(prev, child) => prev.add(child.position),
new THREE.Vector3()
).divideScalar(this.group.children.length);
}
flyBy(factor: number) {
const movementVector = this.flyDirection.clone().multiplyScalar(factor);
const targetPos = this.group.position.clone().add(movementVector);
const willMoveBehindStartingPosition = targetPos.clone().sub(this.flyDirection).dot(this.flyDirection) < -1;
if (!willMoveBehindStartingPosition) {
const distanceFromOrigin = targetPos.distanceTo(new THREE.Vector3());
if (distanceFromOrigin >= 0 && distanceFromOrigin < 3) {
this.group.position.add(movementVector);
}
} else {
this.group.position.set(0, 0, 0);
}
}
asObj3D(): THREE.Object3D {
return this.group;
}
}

View File

@@ -0,0 +1,87 @@
import * as THREE from 'three';
import type SomaSolution from "../../SomaSolution";
import RotationControl from "./RotationControl";
import PolycubeMesh from "./PolycubeMesh";
import VoxelSpace, {DimensionDef} from "../../VoxelSpace";
import GeometryManager from "./GeometryManager";
export default class PolycubeScene {
private renderer: THREE.WebGLRenderer;
private camera: THREE.Camera;
private mainScene: THREE.Scene;
private polycubeMeshes: PolycubeMesh[] = [];
private controls: RotationControl;
private light: THREE.Light;
private cubeScene: THREE.Scene;
private geomManager: GeometryManager;
constructor(el: HTMLCanvasElement, onReady: () => any, onError: (err: Error) => any) {
this.init(el).then(onReady).catch(onError);
}
private async init(el: HTMLCanvasElement) {
this.renderer = new THREE.WebGLRenderer({canvas: el, antialias: true});
this.setupCamera(el.clientWidth / el.clientHeight);
this.setupLight();
this.mainScene = new THREE.Scene();
this.cubeScene = new THREE.Scene();
this.mainScene.add(this.cubeScene, this.camera, this.light);
this.cubeScene.rotateX(Math.PI/4);
this.cubeScene.rotateY(Math.PI/4);
this.controls = new RotationControl(this.cubeScene, this.polycubeMeshes, this.camera, el);
this.geomManager = await new GeometryManager('../resources/', () => {
requestAnimationFrame((timestamp) => this.render(timestamp));
});
PolycubeMesh.setManager(this.geomManager);
}
private setupCamera(aspect: number) {
const fov = 60;
const near = 0.1;
const far = 15;
this.camera = new THREE.PerspectiveCamera(fov, aspect, near, far);
this.camera.position.z = 6;
this.camera.lookAt(0, 0, 0);
}
private showPolycube(polycube: bigint, dims: number, color: string) {
this.controls.disableFly();
const voxelSpace = new VoxelSpace(0, [dims, dims, dims], polycube, true);
this.clearScene();
this.addPolycube(voxelSpace, color);
this.polycubeMeshes[0].center();
}
private showSolution(solution: SomaSolution, colorMap: Record<number, string>) {
this.controls.enableFly();
this.clearScene();
const pieces = solution.getPieces();
for (let i = 0; i < pieces.length; i++) {
this.addPolycube(pieces[i], colorMap[i]);
}
}
private clearScene() {
this.polycubeMeshes.splice(0, this.polycubeMeshes.length);
this.cubeScene.clear();
}
private addPolycube(voxelSpace: VoxelSpace, color: string) {
const newMesh = new PolycubeMesh(voxelSpace, color);
this.polycubeMeshes.push(newMesh);
this.cubeScene.add(newMesh.asObj3D());
}
private setupLight() {
const color = 0xFFFFFF;
const intensity = 1;
this.light = new THREE.DirectionalLight(color, intensity);
this.light.position.set(4, 6, 24);
this.light.lookAt(0,0,0);
}
private render(time: number) {
this.renderer.render(this.mainScene, this.camera);
requestAnimationFrame((time: number) => this.render(time));
}
}

View File

@@ -1,18 +1,26 @@
import type * as THREE from 'three';
interface Fliable {
flyBy(factor: number);
}
export default class RotationControls {
private static ROTATION_FACTOR = 1/200;
private object: THREE.Object3D;
private element: HTMLCanvasElement;
private respondToMovement: boolean = false;
private dragging: boolean = false;
private flyingEnabled = true;
private lastX: number = 0;
private lastY: number = 0;
private yAxis: THREE.Vector3;
private xAxis: THREE.Vector3;
private start: THREE.Euler;
private fliables: Fliable[];
private hovered: boolean = false;
constructor(object: THREE.Object3D, camera: THREE.Camera, element: HTMLCanvasElement) {
constructor(object: THREE.Object3D, fliables: Fliable[], camera: THREE.Camera, element: HTMLCanvasElement) {
this.object = object;
this.fliables = fliables;
this.element = element;
this.yAxis = object.worldToLocal(camera.up);
this.xAxis = object.position.sub(camera.position);
@@ -20,26 +28,50 @@ export default class RotationControls {
this.xAxis = this.xAxis.clone().cross(this.yAxis.clone());
this.start = this.object.rotation.clone();
this.element.addEventListener('mouseover', () => this.hovered = true);
this.element.addEventListener('mouseout', () => this.hovered = false);
this.element.addEventListener('wheel', (ev) => this.handleScroll(ev));
this.element.addEventListener('mousedown', (event) => {
if (event.button === 1) {
this.object.setRotationFromEuler(this.start);
}
if (!this.respondToMovement) {
if (!this.dragging) {
this.lastX = event.x;
this.lastY = event.y;
this.respondToMovement = true;
this.dragging = true;
}
});
window.addEventListener('mousemove', (ev) => this.handleMove(ev));
window.addEventListener('mouseup', () => this.respondToMovement = false);
window.addEventListener('mouseup', () => this.dragging = false);
}
private handleMove(event: MouseEvent) {
if (this.respondToMovement) {
if (this.dragging) {
const xDiff = event.movementX * RotationControls.ROTATION_FACTOR;
const yDiff = event.movementY * RotationControls.ROTATION_FACTOR;
this.object.rotateOnAxis(this.yAxis, xDiff);
this.object.rotateOnWorldAxis(this.xAxis, yDiff);
}
}
private handleScroll(event: WheelEvent) {
if (this.flyingEnabled && this.hovered) {
for (const fliable of this.fliables) {
const direction = event.deltaY / Math.abs(event.deltaY);
fliable.flyBy(direction / 10);
}
}
}
enableFly() {
this.flyingEnabled = true;
}
disableFly() {
this.flyingEnabled = false;
}
private static isMesh(object: THREE.Object3D): object is THREE.Mesh {
return (object as THREE.Mesh).isMesh;
}
}

View File

@@ -2,8 +2,8 @@
"extends": "@tsconfig/svelte/tsconfig.json",
"compilerOptions": {
"lib": ["dom", "ESNext"],
"target": "ESNext",
"target": "ESNext"
},
"include": ["./src/**/*"],
"exclude": ["./node_modules/*", "./__sapper__/*", "./public/*"]
"exclude": ["./node_modules/*", "./__sapper__/*", "./public/*", "./src/solver/**/*"]
}