Name
*
Code
{"properties":{"frame":0,"maxFrame":600,"maxFrameLocked":false,"realtimeState":true,"mainCameraPath":"/perspectiveCamera1","versions":{"polygonjs":"1.2.64"}},"root":{"type":"root","nodes":{"geo1":{"type":"geo","nodes":{"COP":{"type":"copNetwork","nodes":{"image0":{"type":"image","params":{"url":"https://raw.githubusercontent.com/polygonjs/polygonjs-assets/master/textures/uv.jpg"}},"image1":{"type":"image","params":{"url":"https://raw.githubusercontent.com/polygonjs/polygonjs-assets/master/textures/resources/polyhaven.com/fabric_pattern_07/2k/diffuse.jpg"}},"image2":{"type":"image","params":{"url":"https://raw.githubusercontent.com/polygonjs/polygonjs-assets/master/textures/resources/polyhaven.com/brick_moss_001/2k/diffuse.jpg"}}}},"MAT":{"type":"materialsNetwork","nodes":{"meshBasic0":{"type":"meshBasic","params":{"useMap":true,"map":"../../COP/image0"}},"meshBasic1":{"type":"meshBasic","params":{"useMap":true,"map":"../../COP/image1"}},"meshBasic2":{"type":"meshBasic","params":{"useMap":true,"map":"../../COP/image2"}}}},"copy1":{"type":"copy","params":{"count":3,"t":[2,0,0]},"inputs":["material1"],"flags":{"display":true}},"material1":{"type":"material","params":{"material":"../MAT/meshBasic`copy('../copy1')*1+0`"},"inputs":["sphere1"]},"sphere1":{"type":"sphere","params":{"radius":0.96},"inputs":["code1"]},"code1":{"type":"code","params":{"codeTypescript":"\nexport class CodeSopProcessor extends BaseCodeSopProcessor {\n\toverride initializeProcessor(){\n\t}\n\toverride cook(inputCoreGroups: CoreGroup[]){\n\t\t// console.log(inputCoreGroups)\n\t\tconst assetsRoot = 'https://raw.githubusercontent.com/polygonjs/polygonjs-assets/master/textures'\n\t\tconst shortNames = [\n\t\t\t'uv.jpg',\n\t\t\t'resources/polyhaven.com/fabric_pattern_07/2k/diffuse.jpg',\n\t\t\t'resources/polyhaven.com/brick_moss_001/2k/diffuse.jpg'\n\t\t];\n\t\tconsole.log('shortNames',shortNames);\n\t\tconst COP = this.node.node('../COP') as CopNetworkSopNode\n\t\tconst MAT = this.node.node('../MAT') as MaterialsNetworkSopNode\n\n\t\t// delete existing nodes\n\t\tlet childCopNode: BaseCopNodeType|undefined\n\t\twhile(childCopNode = COP.children()[0]){\n\t\t\tCOP.removeNode(childCopNode)\n\t\t}\n\t\tlet childMatNode: BaseMatNodeType|undefined\n\t\twhile(childMatNode = MAT.children()[0]){\n\t\t\tMAT.removeNode(childMatNode)\n\t\t}\n\n\t\t// create textures and materials\n\t\tfor(let i=0; i<shortNames.length; i++){\n\t\t\t// create cop node\n\t\t\tconst imageUrl = [assetsRoot,shortNames[i]].join('/');\n\t\t\tconst imageCopNode = COP.createNode('image');\n\t\t\timageCopNode.p.url.set(imageUrl);\n\t\t\timageCopNode.setName('image'+i);\n\t\t\t// create mat node\n\t\t\tconst meshBasicMatNode = MAT.createNode('meshBasic');\n\t\t\tmeshBasicMatNode.p.useMap.set(true);\n\t\t\tmeshBasicMatNode.p.map.set('../../COP/image'+i);\n\t\t\tmeshBasicMatNode.setName('meshBasic'+i);\n\n\t\t\t// optional: we move the nodes\n\t\t\t// so that they are easier to inspect\n\t\t\timageCopNode.uiData.setPosition(0, 100*i);\n\t\t\tmeshBasicMatNode.uiData.setPosition(0, 100*i);\n\t\t}\n\n\n\t\t// even though the input of this node is not used\n\t\t// we need to make sure it is marked as done cooking.\n\t\t// So in this case, we call .setCoreGroup\n\t\t// If this was not called, the node would cook once\n\t\t// and never again, as it would still be marked as cooking in progress.\n\t\tconst inputCoreGroup = inputCoreGroups[0];\n\t\tthis.setCoreGroup(inputCoreGroup);\n\t}\n}\n","codeJavascript":"export class CodeSopProcessor extends BaseCodeSopProcessor {\r\n initializeProcessor() {\r\n }\r\n cook(inputCoreGroups) {\r\n // console.log(inputCoreGroups)\r\n const assetsRoot = 'https://raw.githubusercontent.com/polygonjs/polygonjs-assets/master/textures';\r\n const shortNames = [\r\n 'uv.jpg',\r\n 'resources/polyhaven.com/fabric_pattern_07/2k/diffuse.jpg',\r\n 'resources/polyhaven.com/brick_moss_001/2k/diffuse.jpg'\r\n ];\r\n console.log('shortNames', shortNames);\r\n const COP = this.node.node('../COP');\r\n const MAT = this.node.node('../MAT');\r\n // delete existing nodes\r\n let childCopNode;\r\n while (childCopNode = COP.children()[0]) {\r\n COP.removeNode(childCopNode);\r\n }\r\n let childMatNode;\r\n while (childMatNode = MAT.children()[0]) {\r\n MAT.removeNode(childMatNode);\r\n }\r\n // create textures and materials\r\n for (let i = 0; i < shortNames.length; i++) {\r\n // create cop node\r\n const imageUrl = [assetsRoot, shortNames[i]].join('/');\r\n const imageCopNode = COP.createNode('image');\r\n imageCopNode.p.url.set(imageUrl);\r\n imageCopNode.setName('image' + i);\r\n // create mat node\r\n const meshBasicMatNode = MAT.createNode('meshBasic');\r\n meshBasicMatNode.p.useMap.set(true);\r\n meshBasicMatNode.p.map.set('../../COP/image' + i);\r\n meshBasicMatNode.setName('meshBasic' + i);\r\n // optional: we move the nodes\r\n // so that they are easier to inspect\r\n imageCopNode.uiData.setPosition(0, 100 * i);\r\n meshBasicMatNode.uiData.setPosition(0, 100 * i);\r\n }\r\n // even though the input of this node is not used\r\n // we need to make sure it is marked as done cooking.\r\n // So in this case, we call .setCoreGroup\r\n // If this was not called, the node would cook once\r\n // and never again, as it would still be marked as cooking in progress.\r\n const inputCoreGroup = inputCoreGroups[0];\r\n this.setCoreGroup(inputCoreGroup);\r\n }\r\n}\r\n"}}},"flags":{"display":true}},"hemisphereLight1":{"type":"hemisphereLight","flags":{"display":true}},"perspectiveCamera1":{"type":"perspectiveCamera","nodes":{"events1":{"type":"eventsNetwork","nodes":{"cameraOrbitControls1":{"type":"cameraOrbitControls","params":{"target":[2.0876561966466443,-0.04060340244757113,-0.28273938451754854]}}}}},"params":{"t":[1.9444268071639697,2.1161993609210836,4.686026521437992],"r":[-23.46097661513556,-1.5307978098028159,-0.6642616748859466],"controls":"./events1/cameraOrbitControls1"},"flags":{"display":true}}},"params":{"mainCameraPath":"/perspectiveCamera1"}},"ui":{"nodes":{"geo1":{"pos":[-50,-150],"selection":["code1"],"nodes":{"COP":{"pos":[0,350],"comment":"This contains the textures.","nodes":{"image0":{"pos":[0,0]},"image1":{"pos":[0,100]},"image2":{"pos":[0,200]}}},"MAT":{"pos":[0,150],"comment":"This contains the materials that will be loaded by the [../material1](../material1) node.","nodes":{"meshBasic0":{"pos":[0,0]},"meshBasic1":{"pos":[0,100]},"meshBasic2":{"pos":[0,200]}}},"copy1":{"pos":[250,500],"comment":"With the copy node, we iterate 3 times on the nodes above.\\n\\nSince we uses the [copy](https://polygonjs.com/docs/expressions/copy) expression in the material node, it will be recooked on each iteration, and apply a different material on the new sphere every time.\\n\\nNote that this scene only contains 3 materials and textures, so if you wanted to increase the could param of this node, you would have to create more material and texture nodes. You can do that with the editor, or also using the [api](https://polygonjs.com/api)"},"material1":{"pos":[250,100],"comment":"the material param uses the [copy](https://polygonjs.com/docs/expressions/copy) expression to resolve to a different material node on each iteration.\\n\\nThe expression will resolve to the following material nodes:\\n\\n- [../MAT/meshStandard0](../MAT/meshStandard0)\\n- [../MAT/meshStandard1](../MAT/meshStandard1)\\n- [../MAT/meshStandard2](../MAT/meshStandard2)\\n\\n"},"sphere1":{"pos":[250,-150]},"code1":{"pos":[250,-400]}}},"hemisphereLight1":{"pos":[150,100]},"perspectiveCamera1":{"pos":[-200,100],"nodes":{"events1":{"pos":[-200,50],"nodes":{"cameraOrbitControls1":{"pos":[150,50]}}}}}}},"shaders":{}}
Code editor
{"multiple_panel":{"split_ratio":0.5,"split_panel0":{"split_ratio":0.5,"split_panel0":{"panelTypes":["viewer","spreadsheet"],"currentPanelIndex":0,"panel_data":{"camera":"/perspectiveCamera1","isViewerInitLayoutData":true,"linkIndex":1}},"split_panel1":{"panelTypes":["network","viewer","params"],"currentPanelIndex":0,"panel_data":{"camera":{"position":{"x":-125.50369031701946,"y":72.82548171656455},"zoom":0.44099999999999995},"history":{"34":{"position":{"x":-125.50369031701946,"y":72.82548171656455},"zoom":0.44099999999999995},"122":{"position":{"x":-20.76677316293929,"y":-111.18210862619809},"zoom":0.6260000000000001},"125":{"position":{"x":7.531652005898204,"y":-90.92006915137031},"zoom":0.5680000000000001}},"linkIndex":1}},"split_mode":"vertical"},"split_panel1":{"panelTypes":["network","params"],"currentPanelIndex":1,"panel_data":{"active_folder":3310,"linkIndex":1}},"split_mode":"horizontal"},"currentNodes":["/geo1","/geo1","/geo1","/geo1","/geo1","/geo1","/geo1","/geo1"],"navigationHistory":{"nodePaths":{"1":["/geo1/MAT","/geo1","/geo1/COP","/geo1","/geo1/MAT","/geo1","/geo1/MAT","/geo1","/geo1/MAT","/geo1","/geo1/MAT","/geo1","/geo1/MAT","/geo1","/geo1/MAT","/geo1","/geo1/MAT","/geo1","/geo1/COP","/geo1"],"2":["/geo1"],"3":["/geo1"],"4":["/geo1"],"5":["/geo1"],"6":["/geo1"],"7":["/geo1"],"8":["/geo1"]},"index":{"1":19,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0}},"fullscreenPanelId":null,"saveOptions":{"createExport":true,"skipExportSinceRemoteAssetsPresents":false,"minimizeFilesCount":false,"compressJs":true,"createZip":false,"runPostExportCommand":false},"paramsModal":[]}
Used nodes
cop/image;event/cameraOrbitControls;mat/meshBasic;obj/geo;obj/hemisphereLight;obj/perspectiveCamera;sop/code;sop/copNetwork;sop/copy;sop/eventsNetwork;sop/material;sop/materialsNetwork;sop/sphere
Used operations
Used modules
Used assemblers
Used integrations
[]
Used assets
Nodes map
{"/geo1":"obj/geo","/geo1/COP":"sop/copNetwork","/geo1/COP/image0":"cop/image","/geo1/COP/image1":"cop/image","/geo1/COP/image2":"cop/image","/geo1/MAT":"sop/materialsNetwork","/geo1/MAT/meshBasic0":"mat/meshBasic","/geo1/MAT/meshBasic1":"mat/meshBasic","/geo1/MAT/meshBasic2":"mat/meshBasic","/geo1/copy1":"sop/copy","/geo1/material1":"sop/material","/geo1/sphere1":"sop/sphere","/geo1/code1":"sop/code","/hemisphereLight1":"obj/hemisphereLight","/perspectiveCamera1":"obj/perspectiveCamera","/perspectiveCamera1/events1":"sop/eventsNetwork","/perspectiveCamera1/events1/cameraOrbitControls1":"event/cameraOrbitControls"}
Js version
Editor version
Engine version
Name
*
Code
{"properties":{"frame":0,"maxFrame":600,"maxFrameLocked":false,"realtimeState":true,"mainCameraPath":"/perspectiveCamera1","versions":{"polygonjs":"1.2.64"}},"root":{"type":"root","nodes":{"geo1":{"type":"geo","nodes":{"COP":{"type":"copNetwork","nodes":{"image0":{"type":"image","params":{"url":"https://raw.githubusercontent.com/polygonjs/polygonjs-assets/master/textures/uv.jpg"}},"image1":{"type":"image","params":{"url":"https://raw.githubusercontent.com/polygonjs/polygonjs-assets/master/textures/resources/polyhaven.com/fabric_pattern_07/2k/diffuse.jpg"}},"image2":{"type":"image","params":{"url":"https://raw.githubusercontent.com/polygonjs/polygonjs-assets/master/textures/resources/polyhaven.com/brick_moss_001/2k/diffuse.jpg"}}}},"MAT":{"type":"materialsNetwork","nodes":{"meshBasic0":{"type":"meshBasic","params":{"useMap":true,"map":"../../COP/image0"}},"meshBasic1":{"type":"meshBasic","params":{"useMap":true,"map":"../../COP/image1"}},"meshBasic2":{"type":"meshBasic","params":{"useMap":true,"map":"../../COP/image2"}}}},"copy1":{"type":"copy","params":{"count":3,"t":[2,0,0]},"inputs":["material1"],"flags":{"display":true}},"material1":{"type":"material","params":{"material":"../MAT/meshBasic`copy('../copy1')*1+0`"},"inputs":["sphere1"]},"sphere1":{"type":"sphere","params":{"radius":0.96},"inputs":["code1"]},"code1":{"type":"code","params":{"codeTypescript":"\nexport class CodeSopProcessor extends BaseCodeSopProcessor {\n\toverride initializeProcessor(){\n\t}\n\toverride cook(inputCoreGroups: CoreGroup[]){\n\t\t// console.log(inputCoreGroups)\n\t\tconst assetsRoot = 'https://raw.githubusercontent.com/polygonjs/polygonjs-assets/master/textures'\n\t\tconst shortNames = [\n\t\t\t'uv.jpg',\n\t\t\t'resources/polyhaven.com/fabric_pattern_07/2k/diffuse.jpg',\n\t\t\t'resources/polyhaven.com/brick_moss_001/2k/diffuse.jpg'\n\t\t];\n\t\tconsole.log('shortNames',shortNames);\n\t\tconst COP = this.node.node('../COP') as CopNetworkSopNode\n\t\tconst MAT = this.node.node('../MAT') as MaterialsNetworkSopNode\n\n\t\t// delete existing nodes\n\t\tlet childCopNode: BaseCopNodeType|undefined\n\t\twhile(childCopNode = COP.children()[0]){\n\t\t\tCOP.removeNode(childCopNode)\n\t\t}\n\t\tlet childMatNode: BaseMatNodeType|undefined\n\t\twhile(childMatNode = MAT.children()[0]){\n\t\t\tMAT.removeNode(childMatNode)\n\t\t}\n\n\t\t// create textures and materials\n\t\tfor(let i=0; i<shortNames.length; i++){\n\t\t\t// create cop node\n\t\t\tconst imageUrl = [assetsRoot,shortNames[i]].join('/');\n\t\t\tconst imageCopNode = COP.createNode('image');\n\t\t\timageCopNode.p.url.set(imageUrl);\n\t\t\timageCopNode.setName('image'+i);\n\t\t\t// create mat node\n\t\t\tconst meshBasicMatNode = MAT.createNode('meshBasic');\n\t\t\tmeshBasicMatNode.p.useMap.set(true);\n\t\t\tmeshBasicMatNode.p.map.set('../../COP/image'+i);\n\t\t\tmeshBasicMatNode.setName('meshBasic'+i);\n\n\t\t\t// optional: we move the nodes\n\t\t\t// so that they are easier to inspect\n\t\t\timageCopNode.uiData.setPosition(0, 100*i);\n\t\t\tmeshBasicMatNode.uiData.setPosition(0, 100*i);\n\t\t}\n\n\n\t\t// even though the input of this node is not used\n\t\t// we need to make sure it is marked as done cooking.\n\t\t// So in this case, we call .setCoreGroup\n\t\t// If this was not called, the node would cook once\n\t\t// and never again, as it would still be marked as cooking in progress.\n\t\tconst inputCoreGroup = inputCoreGroups[0];\n\t\tthis.setCoreGroup(inputCoreGroup);\n\t}\n}\n","codeJavascript":"export class CodeSopProcessor extends BaseCodeSopProcessor {\r\n initializeProcessor() {\r\n }\r\n cook(inputCoreGroups) {\r\n // console.log(inputCoreGroups)\r\n const assetsRoot = 'https://raw.githubusercontent.com/polygonjs/polygonjs-assets/master/textures';\r\n const shortNames = [\r\n 'uv.jpg',\r\n 'resources/polyhaven.com/fabric_pattern_07/2k/diffuse.jpg',\r\n 'resources/polyhaven.com/brick_moss_001/2k/diffuse.jpg'\r\n ];\r\n console.log('shortNames', shortNames);\r\n const COP = this.node.node('../COP');\r\n const MAT = this.node.node('../MAT');\r\n // delete existing nodes\r\n let childCopNode;\r\n while (childCopNode = COP.children()[0]) {\r\n COP.removeNode(childCopNode);\r\n }\r\n let childMatNode;\r\n while (childMatNode = MAT.children()[0]) {\r\n MAT.removeNode(childMatNode);\r\n }\r\n // create textures and materials\r\n for (let i = 0; i < shortNames.length; i++) {\r\n // create cop node\r\n const imageUrl = [assetsRoot, shortNames[i]].join('/');\r\n const imageCopNode = COP.createNode('image');\r\n imageCopNode.p.url.set(imageUrl);\r\n imageCopNode.setName('image' + i);\r\n // create mat node\r\n const meshBasicMatNode = MAT.createNode('meshBasic');\r\n meshBasicMatNode.p.useMap.set(true);\r\n meshBasicMatNode.p.map.set('../../COP/image' + i);\r\n meshBasicMatNode.setName('meshBasic' + i);\r\n // optional: we move the nodes\r\n // so that they are easier to inspect\r\n imageCopNode.uiData.setPosition(0, 100 * i);\r\n meshBasicMatNode.uiData.setPosition(0, 100 * i);\r\n }\r\n // even though the input of this node is not used\r\n // we need to make sure it is marked as done cooking.\r\n // So in this case, we call .setCoreGroup\r\n // If this was not called, the node would cook once\r\n // and never again, as it would still be marked as cooking in progress.\r\n const inputCoreGroup = inputCoreGroups[0];\r\n this.setCoreGroup(inputCoreGroup);\r\n }\r\n}\r\n"}}},"flags":{"display":true}},"hemisphereLight1":{"type":"hemisphereLight","flags":{"display":true}},"perspectiveCamera1":{"type":"perspectiveCamera","nodes":{"events1":{"type":"eventsNetwork","nodes":{"cameraOrbitControls1":{"type":"cameraOrbitControls","params":{"target":[2.0876561966466443,-0.04060340244757113,-0.28273938451754854]}}}}},"params":{"t":[1.9444268071639697,2.1161993609210836,4.686026521437992],"r":[-23.46097661513556,-1.5307978098028159,-0.6642616748859466],"controls":"./events1/cameraOrbitControls1"},"flags":{"display":true}}},"params":{"mainCameraPath":"/perspectiveCamera1"}},"ui":{"nodes":{"geo1":{"pos":[-50,-150],"selection":["code1"],"nodes":{"COP":{"pos":[0,350],"comment":"This contains the textures.","nodes":{"image0":{"pos":[0,0]},"image1":{"pos":[0,100]},"image2":{"pos":[0,200]}}},"MAT":{"pos":[0,150],"comment":"This contains the materials that will be loaded by the [../material1](../material1) node.","nodes":{"meshBasic0":{"pos":[0,0]},"meshBasic1":{"pos":[0,100]},"meshBasic2":{"pos":[0,200]}}},"copy1":{"pos":[250,500],"comment":"With the copy node, we iterate 3 times on the nodes above.\\n\\nSince we uses the [copy](https://polygonjs.com/docs/expressions/copy) expression in the material node, it will be recooked on each iteration, and apply a different material on the new sphere every time.\\n\\nNote that this scene only contains 3 materials and textures, so if you wanted to increase the could param of this node, you would have to create more material and texture nodes. You can do that with the editor, or also using the [api](https://polygonjs.com/api)"},"material1":{"pos":[250,100],"comment":"the material param uses the [copy](https://polygonjs.com/docs/expressions/copy) expression to resolve to a different material node on each iteration.\\n\\nThe expression will resolve to the following material nodes:\\n\\n- [../MAT/meshStandard0](../MAT/meshStandard0)\\n- [../MAT/meshStandard1](../MAT/meshStandard1)\\n- [../MAT/meshStandard2](../MAT/meshStandard2)\\n\\n"},"sphere1":{"pos":[250,-150]},"code1":{"pos":[250,-400]}}},"hemisphereLight1":{"pos":[150,100]},"perspectiveCamera1":{"pos":[-200,100],"nodes":{"events1":{"pos":[-200,50],"nodes":{"cameraOrbitControls1":{"pos":[150,50]}}}}}}},"shaders":{}}
Code editor
{"multiple_panel":{"split_ratio":0.5,"split_panel0":{"split_ratio":0.5,"split_panel0":{"panelTypes":["viewer","spreadsheet"],"currentPanelIndex":0,"panel_data":{"camera":"/perspectiveCamera1","isViewerInitLayoutData":true,"linkIndex":1}},"split_panel1":{"panelTypes":["network","viewer","params"],"currentPanelIndex":0,"panel_data":{"camera":{"position":{"x":-125.50369031701946,"y":72.82548171656455},"zoom":0.44099999999999995},"history":{"34":{"position":{"x":-125.50369031701946,"y":72.82548171656455},"zoom":0.44099999999999995},"122":{"position":{"x":-20.76677316293929,"y":-111.18210862619809},"zoom":0.6260000000000001},"125":{"position":{"x":7.531652005898204,"y":-90.92006915137031},"zoom":0.5680000000000001}},"linkIndex":1}},"split_mode":"vertical"},"split_panel1":{"panelTypes":["network","params"],"currentPanelIndex":1,"panel_data":{"active_folder":3310,"linkIndex":1}},"split_mode":"horizontal"},"currentNodes":["/geo1","/geo1","/geo1","/geo1","/geo1","/geo1","/geo1","/geo1"],"navigationHistory":{"nodePaths":{"1":["/geo1/MAT","/geo1","/geo1/COP","/geo1","/geo1/MAT","/geo1","/geo1/MAT","/geo1","/geo1/MAT","/geo1","/geo1/MAT","/geo1","/geo1/MAT","/geo1","/geo1/MAT","/geo1","/geo1/MAT","/geo1","/geo1/COP","/geo1"],"2":["/geo1"],"3":["/geo1"],"4":["/geo1"],"5":["/geo1"],"6":["/geo1"],"7":["/geo1"],"8":["/geo1"]},"index":{"1":19,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0}},"fullscreenPanelId":null,"saveOptions":{"createExport":true,"skipExportSinceRemoteAssetsPresents":false,"minimizeFilesCount":false,"compressJs":true,"createZip":false,"runPostExportCommand":false},"paramsModal":[]}
Used nodes
cop/image;event/cameraOrbitControls;mat/meshBasic;obj/geo;obj/hemisphereLight;obj/perspectiveCamera;sop/code;sop/copNetwork;sop/copy;sop/eventsNetwork;sop/material;sop/materialsNetwork;sop/sphere
Used operations
Used modules
Used assemblers
Used integrations
[]
Used assets
Nodes map
{"/geo1":"obj/geo","/geo1/COP":"sop/copNetwork","/geo1/COP/image0":"cop/image","/geo1/COP/image1":"cop/image","/geo1/COP/image2":"cop/image","/geo1/MAT":"sop/materialsNetwork","/geo1/MAT/meshBasic0":"mat/meshBasic","/geo1/MAT/meshBasic1":"mat/meshBasic","/geo1/MAT/meshBasic2":"mat/meshBasic","/geo1/copy1":"sop/copy","/geo1/material1":"sop/material","/geo1/sphere1":"sop/sphere","/geo1/code1":"sop/code","/hemisphereLight1":"obj/hemisphereLight","/perspectiveCamera1":"obj/perspectiveCamera","/perspectiveCamera1/events1":"sop/eventsNetwork","/perspectiveCamera1/events1/cameraOrbitControls1":"event/cameraOrbitControls"}
Js version
Editor version
Engine version
Logout
0%
There was a problem displaying your scene:
view scene source