diff --git a/.trellis/spec/blender/asset-generation.md b/.trellis/spec/blender/asset-generation.md index 65207e2..0766439 100644 --- a/.trellis/spec/blender/asset-generation.md +++ b/.trellis/spec/blender/asset-generation.md @@ -105,26 +105,44 @@ catalog.MATERIALS 声明「是什么」 纯 Python,无 bpy 不管源文件把原点放在哪(`tree.py:301-303`) `assemble()` 返回种植数量,**0 表示模型缺失或 style 未知**,调用方据此回退到程序化 -树(`tree.py:277-279`)。 +树。 -### 材质在本地重建,不沿用源文件 +### Shapespark 是当前模型树样式 -`tree.py:12-16`:两个 vendored 模型的材质都不能直接用。apple 的贴图 57% 是透明的 -(那是叶片卡),没有 alpha-clip 设置的话整个树冠会渲染成一块。 +当前唯一模型树 style 是 `shapespark`,资产来自 +`assets/models/custom/shapespark_plants/tree-*/model.gltf`。该目录是从 +Shapespark low-poly plants kit 拆分出的单植物 glTF/bin,贴图共享在 +`assets/models/custom/shapespark_plants/textures/`。 -**vendored 资产的材质一律重建**,不要 `append` 源文件的材质。 +`tree.py` 加载 12 个 tree 变体,每个变体 import 一次、bake 成共享 mesh datablock; +OSM 树实例只 link 这些 mesh。变体选择必须确定性,当前用 stable instance index 经过 +golden-turn 序列选变体: -### 已删除的第三种 style 有记录 +```python +variant = variants[int(((index * GOLDEN_TURN) % 1.0) * len(variants))] +``` + +拆分 glTF 会让 Blender 生成 `branch-01.001`、`branch-01.002` 这类重复材质名; +`tree.py` 必须按 base name 去重材质槽,否则 `export_cesium.py` 会为同一张贴图重复 +bake Cesium 材质。 + +### 已删除的模型树 style 有记录 `tree.py:18-25` 记着 `polyhaven` style 被删的原因(LOD1 对象不是整棵树,是给几何节点 散布用的树枝和叶簇,直接种出来是一地树枝,连同 78MB 资产一起删了)。 +`apple` 和 `fattree` style 已在 Shapespark 方案被用户接受后删除:apple 需要强抠图、 +法线和 Cesium 曝光补偿,远近观感不如 Shapespark 稳定;fattree 视觉风格不匹配。 +对应资产目录 `assets/models/speedtree/apple_low/` 和 `assets/models/lyrog/fattree/` +也已删除。 + **这类"试过、不行、为什么"的记录要保留。** 删掉它,下一个人会重新引入同一个资产。 ## 灌木边缘实例有性能预算 `generate_scene.py` 的 scrub 不是只有贴地面:`natural=scrub` 会先生成 -`Scrub_` 地面覆盖,再沿边界实例化 `assets/models/custom/bush/bush.glb` +`Scrub_` 地面覆盖,再沿边界实例化 +`assets/models/custom/shapespark_plants/bush-03/model.gltf` (`add_scrub_edge_bushes()`),并在大 scrub 面内部稀疏补树。 这些 bush 是共享 mesh 的多 node 实例。共享 mesh 能压 GLB 体积,但 Cesium 近景 Follow @@ -137,15 +155,15 @@ SCRUB_BUSH_SPACING = 1.8 SCRUB_BUSH_LIMIT_PER_PATCH = 60 ``` -在 nantaizi 上约 `266` 个 bush nodes,scrub 地面覆盖仍保留。当前默认资产仍是 -`assets/models/custom/bush/bush.glb`。`assets/models/custom/bush_low/bush_low.glb` -曾作为低模实验验证过:几何从 `63,762` vertices / `67,536` indices 降到 -`4,044` / `4,050`,但用户实测视觉效果不理想,**不要直接把它设为默认**。 +在 nantaizi 上约 `266` 个 bush nodes,scrub 地面覆盖仍保留。旧高模 bush 和 +rejected `bush_low` 资产已删除:前者太重,后者几何从 +`63,762` vertices / `67,536` indices 降到 +`4,044` / `4,050`,但用户实测视觉效果不理想,不能作为默认方向。 不要只为了“更满”把间距调回 1m 以下;那是在把预览流畅度换成近景装饰密度。若确实 需要更密的灌木,先做一个视觉可接受的低模 bush,或做显式 LOD / instancing 方案,再 -跑 nantaizi 的 Blender/Cesium/preview 验证。注意:`bush_low` 的文件仍有 `5.79 MB`, -因为 6 张纹理没有同步压缩;继续压 GLB 总体体积应考虑纹理尺寸/KTX2,而不是只减面。 +跑 nantaizi 的 Blender/Cesium/preview 验证。继续压 GLB 总体体积应考虑贴图尺寸/KTX2, +而不是只减面。 --- diff --git a/.trellis/spec/config/index.md b/.trellis/spec/config/index.md index d6efe37..9d9b0d9 100644 --- a/.trellis/spec/config/index.md +++ b/.trellis/spec/config/index.md @@ -114,7 +114,7 @@ cp config/examples/template.json config/areas/my-area.json | 字段 | 默认 | 说明 | |---|---|---| -| `treeStyle` | `"natural"` | 合法值见 `generate_scene.py:144` 的 `TREE_STYLES`(`natural`、`procedural`,加上 `tree.py` 注册的模型 style) | +| `treeStyle` | `"natural"` | 合法值见 `generate_scene.py` 的 `TREE_STYLES`(`natural`、`procedural`、`shapespark`) | | `officeOverrides` | `""` | 旧名 `office_overrides` 仍被接受 | ### `outputs`(逃生舱) diff --git a/.trellis/tasks/08-03-test-shapespark-tree-variants/check.jsonl b/.trellis/tasks/08-03-test-shapespark-tree-variants/check.jsonl new file mode 100644 index 0000000..9dd3234 --- /dev/null +++ b/.trellis/tasks/08-03-test-shapespark-tree-variants/check.jsonl @@ -0,0 +1 @@ +{"_example": "Fill with {\"file\": \"\", \"reason\": \"\"}. Put spec/research files only — no code paths. Run `python3 .trellis/scripts/get_context.py --mode packages` to list available specs. Delete this line once real entries are added."} diff --git a/.trellis/tasks/08-03-test-shapespark-tree-variants/implement.jsonl b/.trellis/tasks/08-03-test-shapespark-tree-variants/implement.jsonl new file mode 100644 index 0000000..9dd3234 --- /dev/null +++ b/.trellis/tasks/08-03-test-shapespark-tree-variants/implement.jsonl @@ -0,0 +1 @@ +{"_example": "Fill with {\"file\": \"\", \"reason\": \"\"}. Put spec/research files only — no code paths. Run `python3 .trellis/scripts/get_context.py --mode packages` to list available specs. Delete this line once real entries are added."} diff --git a/.trellis/tasks/08-03-test-shapespark-tree-variants/prd.md b/.trellis/tasks/08-03-test-shapespark-tree-variants/prd.md new file mode 100644 index 0000000..f914716 --- /dev/null +++ b/.trellis/tasks/08-03-test-shapespark-tree-variants/prd.md @@ -0,0 +1,47 @@ +# Test Shapespark tree variants + +## Goal + +Use the split Shapespark low-poly plant assets as tree, scrub bush, and lawn +tuft variants, then validate `nantaizi-lake-innovation-valley`. + +The user liked the Shapespark `bush-03` scrub replacement and wants to evaluate +whether the same kit can replace the current tree asset. If multiple tree +variants are not too expensive, the scene should use varied trees while staying +deterministic for the same OSM input. + +## Requirements + +1. Prefer Shapespark tree assets from + `assets/models/custom/shapespark_plants/tree-*/model.gltf`. +2. Use deterministic variant selection based on stable tree instance ordering; + do not use unseeded random or time-dependent randomness. +3. Preserve existing tree placement count and route/road/building behavior. +4. Preserve the existing scrub bush `bush-03` experiment. +5. Replace the old Poly Haven `shrub_02` lawn tuft asset with suitable + Shapespark grass assets. +6. Evaluate the cost of loading multiple tree and lawn tuft variants: + - number of shared tree meshes introduced + - number of shared lawn tuft meshes introduced + - texture/image/material counts + - output GLB size + - total nodes +7. Rebuild only `nantaizi-lake-innovation-valley` stages + `blender,cesium,preview`. + +## Acceptance Criteria + +- [ ] Tree generation uses Shapespark tree variants deterministically. +- [ ] Lawn tufts use Shapespark `grass-*` variants instead of `shrub_02`. +- [ ] `python3 -m py_compile blender/generate_scene.py blender/osmassets/tree.py` passes. +- [ ] `python3 -m unittest blender/tests/test_pure.py` passes. +- [ ] nantaizi `blender,cesium,preview` rebuild passes. +- [ ] GLB digest reports tree mesh/material/image/node cost. +- [ ] User can open the local preview and compare visual result. + +## Out Of Scope + +- Runtime LOD. +- hanyang validation. +- Texture compression / KTX2. +- Committing the experiment before user approval. diff --git a/.trellis/tasks/08-03-test-shapespark-tree-variants/report.md b/.trellis/tasks/08-03-test-shapespark-tree-variants/report.md new file mode 100644 index 0000000..a91f704 --- /dev/null +++ b/.trellis/tasks/08-03-test-shapespark-tree-variants/report.md @@ -0,0 +1,99 @@ +# Shapespark tree variant experiment report + +## Current Trial + +`nantaizi-lake-innovation-valley` now uses: + +- scrub bush: `assets/models/custom/shapespark_plants/bush-03/model.gltf` +- tree style: `shapespark` +- Shapespark tree variants: 12 deterministic variants from + `assets/models/custom/shapespark_plants/tree-*/model.gltf` +- lawn tufts: 3 Shapespark grass variants from + `assets/models/custom/shapespark_plants/grass-*/model.gltf` +- Cesium export uses a gentler Shapespark foliage profile: + `gain=1.12`, `saturation=1.0`, `emission=0.06`. + +Variant selection is deterministic: it uses the stable tree instance index and +the golden-turn sequence, not runtime random state. + +## Validation + +Commands run: + +```bash +python3 -m py_compile blender/generate_scene.py blender/osmassets/tree.py blender/export_cesium.py +python3 -m unittest blender/tests/test_pure.py +npm run build:area -- --config config/areas/nantaizi-lake-innovation-valley.json --stages blender,cesium,preview +node scripts/glb-digest.js outputs/nantaizi-lake-innovation-valley/nantaizi-lake-innovation-valley.glb --out /tmp/nantaizi-shapespark-tree-glb-digest.json +node scripts/glb-digest.js outputs/nantaizi-lake-innovation-valley/nantaizi-lake-innovation-valley.glb --out /tmp/nantaizi-shapespark-grass-glb-digest.json +node scripts/glb-digest.js outputs/nantaizi-lake-innovation-valley/nantaizi-lake-innovation-valley.glb --out /tmp/nantaizi-shapespark-toned-glb-digest.json +node scripts/glb-digest.js outputs/nantaizi-lake-innovation-valley/nantaizi-lake-innovation-valley.glb --out /tmp/nantaizi-shapespark-toned-rebuild.json +node scripts/glb-digest.js outputs/nantaizi-lake-innovation-valley/nantaizi-lake-innovation-valley.glb --out /tmp/nantaizi-shapespark-cleanup.json +python3 ./.trellis/scripts/task.py validate .trellis/tasks/08-03-test-shapespark-tree-variants +``` + +Results: + +- `SCENE_DONE.tree_style`: `shapespark` +- Trees planted: `197` +- Grass tufts planted: `270` +- Scrub bush nodes: `266` +- GLB nodes: `830` +- GLB meshes: `113` +- GLB materials: `32` +- GLB images: `18` +- GLB accessors after final rebuild: `675` (accessor count is a known glTF + exporter fluctuation and is ignored by parity) +- GLB size after color tuning: `20.50 MB` +- Shapespark tree mesh datablocks: `12` +- Shapespark tree materials: `7` +- Shapespark tree images: `7` +- Shapespark tree shared geometry: `6,255` vertices / `18,696` indices +- Shapespark lawn tuft mesh datablocks: `3` +- Shapespark lawn tuft materials: `2` +- Shapespark lawn tuft images: `2` +- Shapespark lawn tuft shared geometry: `84` vertices / `90` indices + +## Assessment + +The multi-tree cost is acceptable for this scene. Tree node count stays the +same because the implementation links shared mesh datablocks per instance. +The extra cost is only 11 more shared tree mesh datablocks than a single tree +variant, plus 7 tree texture/material entries. The total GLB is still smaller +than the previous apple-tree build because the Shapespark textures and meshes +are lighter. + +Replacing the former Poly Haven `shrub_02` lawn tuft with Shapespark +`grass-01/02/03` further reduces shared tuft geometry from a high-detail plant +asset to only 3 tiny grass-card variants. The lawn tuft instance count stays +the same, so the visual density is comparable while the shared geometry cost is +effectively negligible. + +The color issue came from reusing the apple-tree export profile for every +alpha-cut plant. Apple needs strong albedo gain / saturation / emission because +its atlas is unusually dark. Shapespark foliage does not; using the apple +profile made it read yellow-green and glowing. The final trial keeps the +alpha-mask cleanup but uses much lower exposure and emission for Shapespark +material names (`branch-*`, `shrubbery-*`, `high-grass-*`, `hedge-*`, +`clover-*`, `flowers-*`). + +Compared with the pre-Shapespark scrub-density baseline (`31.96 MB` GLB), this +trial is about `11.46 MB` smaller while keeping the same object count budget: +`830` nodes, `197` trees, `270` lawn tufts, and `266` scrub bush instances. +The main savings come from replacing the original heavy scrub bush, the +high-detail lawn tuft asset, and the apple tree atlas with lighter shared +Shapespark assets. + +## Cleanup + +After user visual approval, the old vegetation assets and their runtime loaders +were removed: + +- retired tree styles: `apple`, `fattree` +- removed assets: SpeedTree apple, Lyrog fattree, Poly Haven `shrub_02`, + original `custom/bush`, rejected `custom/bush_low` +- remaining model tree style: `shapespark` +- remaining external plant asset root: + `assets/models/custom/shapespark_plants/` +- nantaizi rebuild after cleanup stayed at `20.50 MB`, `830` nodes, `113` + meshes, `32` materials, `18` images diff --git a/.trellis/tasks/08-03-test-shapespark-tree-variants/task.json b/.trellis/tasks/08-03-test-shapespark-tree-variants/task.json new file mode 100644 index 0000000..809cf0c --- /dev/null +++ b/.trellis/tasks/08-03-test-shapespark-tree-variants/task.json @@ -0,0 +1,26 @@ +{ + "id": "test-shapespark-tree-variants", + "name": "test-shapespark-tree-variants", + "title": "Test Shapespark tree variants", + "description": "", + "status": "in_progress", + "dev_type": null, + "scope": null, + "package": null, + "priority": "P2", + "creator": "dingkang", + "assignee": "dingkang", + "createdAt": "2026-08-03", + "completedAt": null, + "branch": null, + "base_branch": "main", + "worktree_path": null, + "commit": null, + "pr_url": null, + "subtasks": [], + "children": [], + "parent": null, + "relatedFiles": [], + "notes": "", + "meta": {} +} \ No newline at end of file diff --git a/README.md b/README.md index 9bd0200..7d6f8a5 100644 --- a/README.md +++ b/README.md @@ -157,6 +157,10 @@ Blender 低层命令: --tree-style natural ``` +`--tree-style` 可选 `natural`、`procedural`、`shapespark`。`shapespark` 使用 +`assets/models/custom/shapespark_plants/` 里的拆分低模植物资产;模型缺失时会回落到 +`natural`。 + Cesium GLB 低层导出: ```bash diff --git a/assets/models/SOURCES.md b/assets/models/SOURCES.md index 9e8ee95..5966013 100644 --- a/assets/models/SOURCES.md +++ b/assets/models/SOURCES.md @@ -1,47 +1,21 @@ -# 树模型资产来源 +# 植物模型资产来源 -`assets/models/` 下的树模型是第三方素材,**已 gitignore**,不随仓库分发。 -干净 checkout 缺这些文件时 `tree.assemble()` 返回 0,`generate_scene.py` -自动回落到 `natural` 样式,构建不会失败。 +`assets/models/custom/shapespark_plants/` 保存从 Shapespark low-poly plants kit +拆分出的植物资产。每个植物目录包含: -放置路径见 `blender/osmassets/tree.py` 顶部的常量。 +- `model.gltf` +- `model.bin` +- `preview.png` -## apple(`--tree-style apple`) +贴图统一放在 `assets/models/custom/shapespark_plants/textures/`,由各个 glTF +相对引用。`manifest.json` 记录每个拆分资产的类别、几何指标、材质名和预览图路径。 -- 名称:RedDeliciousApple(SpeedTree 工具导出) -- 路径:`assets/models/speedtree/apple_low/` - - `RedDeliciousApple.obj` — 4475 tris,单网格 - - `RedDeliciousApple.mtl` — 已重写,见文件内注释 - - `textures/apple_color_2k.png` — 由原始 4096² PNG 降采样,**必须保留 alpha 通道**, - 57% 的像素是抠掉的叶片卡片 - - `textures/apple_normal_2k.png` — 同上降采样 +当前管线使用: -原始素材另有 `.fbx` / `.cgf` / `.st` / `.tif` 以及 `_SS` / `_Subsurface` 贴图, -管线不用,未收录。 +- `tree-01-*`、`tree-02-*`、`tree-03-*`:`--tree-style shapespark` 的 12 个确定性树变体 +- `bush-03`:`natural=scrub` 边缘 bush 实例 +- `grass-01`、`grass-02`、`grass-03`:`landuse=grass` 草坪草簇 -降采样命令(原始 4k 贴图 16MB + 20MB,降到 2k 后 4.3MB + 4.7MB): - -```bash -sips -Z 2048 -s format png <原始>_Color.png --out textures/apple_color_2k.png -sips -Z 2048 -s format png <原始>_Normal.png --out textures/apple_normal_2k.png -``` - -## fattree(`--tree-style fattree`) - -- 名称:fat tree,作者署名 Lyrog(付费素材) -- 路径:`assets/models/lyrog/fattree/` - - `fattree.blend` — 取其中名为 `fattree` 的对象,2238 tris - - `textures/fat_tree.png` — 原文件名带空格(`fat tree.png`),已改为下划线 - -源 .blend 里的贴图路径是 `//fat tree.png`,只在原始目录下能解析; -运行时不依赖它,`tree.py` 会丢掉源材质并按上面的路径重建一个 Principled 材质。 -该 .blend 里另有两个 `plant` 对象(灌木),管线未使用。 - -## 已移除 - -`polyhaven/island_tree_01`(76MB)已于 2026-07-31 删除,连同 `--tree-style polyhaven` -和 `blender/tools/ingest_tree.py`。原因见 `docs/changelog.md`:该文件的 `*_LOD1` -对象不是完整的树,而是给几何节点散布用的枝叶碎片。 -若要重新取用,Poly Haven 上是 CC0:https://polyhaven.com/a/island_tree_01 - -`polyhaven/shrub_02` 仍在使用(草丛散布),不受影响。 +旧的 SpeedTree apple、Lyrog fattree、Poly Haven `shrub_02`、原始高模 +`custom/bush` 和 rejected `custom/bush_low` 已删除。相关实验结论保留在 +`docs/changelog.md` 和归档 Trellis 任务中。 diff --git a/assets/models/custom/bush/bush.glb b/assets/models/custom/bush/bush.glb deleted file mode 100644 index b38ac75..0000000 Binary files a/assets/models/custom/bush/bush.glb and /dev/null differ diff --git a/assets/models/custom/shapespark_plants/bush-01/model.bin b/assets/models/custom/shapespark_plants/bush-01/model.bin new file mode 100644 index 0000000..b54779a Binary files /dev/null and b/assets/models/custom/shapespark_plants/bush-01/model.bin differ diff --git a/assets/models/custom/shapespark_plants/bush-01/model.gltf b/assets/models/custom/shapespark_plants/bush-01/model.gltf new file mode 100644 index 0000000..e74d7e3 --- /dev/null +++ b/assets/models/custom/shapespark_plants/bush-01/model.gltf @@ -0,0 +1,246 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.5.51", + "version":"2.0" + }, + "extensionsUsed":[ + "KHR_materials_specular", + "KHR_materials_ior" + ], + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Bush-01.001" + } + ], + "materials":[ + { + "alphaMode":"BLEND", + "doubleSided":true, + "extensions":{ + "KHR_materials_specular":{ + "specularFactor":0 + }, + "KHR_materials_ior":{ + "ior":1.4500000476837158 + } + }, + "name":"branch-1-01", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":0 + }, + "metallicFactor":0, + "roughnessFactor":0.5 + } + }, + { + "alphaMode":"BLEND", + "doubleSided":true, + "extensions":{ + "KHR_materials_specular":{ + "specularFactor":0 + }, + "KHR_materials_ior":{ + "ior":1.4500000476837158 + } + }, + "name":"branch-1-02", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "roughnessFactor":0.5 + } + } + ], + "meshes":[ + { + "name":"Plane.001", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + }, + { + "attributes":{ + "POSITION":4, + "NORMAL":5, + "TEXCOORD_0":6 + }, + "indices":7, + "material":1 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"branch-01", + "uri":"../textures/branch-01.png" + }, + { + "mimeType":"image/png", + "name":"branch-02", + "uri":"../textures/branch-02.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":99, + "max":[ + 0.6232271194458008, + 0.8840625286102295, + 0.5985598564147949 + ], + "min":[ + -0.4801969528198242, + 0.003126591444015503, + -0.5000066757202148 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":99, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":99, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":264, + "type":"SCALAR" + }, + { + "bufferView":4, + "componentType":5126, + "count":45, + "max":[ + 0.5563669204711914, + 0.8848730325698853, + 0.4917292594909668 + ], + "min":[ + -0.6232271194458008, + 0, + -0.5985598564147949 + ], + "type":"VEC3" + }, + { + "bufferView":5, + "componentType":5126, + "count":45, + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":45, + "type":"VEC2" + }, + { + "bufferView":7, + "componentType":5123, + "count":120, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":1188, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":1188, + "byteOffset":1188, + "target":34962 + }, + { + "buffer":0, + "byteLength":792, + "byteOffset":2376, + "target":34962 + }, + { + "buffer":0, + "byteLength":528, + "byteOffset":3168, + "target":34963 + }, + { + "buffer":0, + "byteLength":540, + "byteOffset":3696, + "target":34962 + }, + { + "buffer":0, + "byteLength":540, + "byteOffset":4236, + "target":34962 + }, + { + "buffer":0, + "byteLength":360, + "byteOffset":4776, + "target":34962 + }, + { + "buffer":0, + "byteLength":240, + "byteOffset":5136, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":5376, + "uri":"model.bin" + } + ] +} diff --git a/assets/models/custom/shapespark_plants/bush-01/preview.png b/assets/models/custom/shapespark_plants/bush-01/preview.png new file mode 100644 index 0000000..9a1c795 Binary files /dev/null and b/assets/models/custom/shapespark_plants/bush-01/preview.png differ diff --git a/assets/models/custom/shapespark_plants/bush-02/model.bin b/assets/models/custom/shapespark_plants/bush-02/model.bin new file mode 100644 index 0000000..f6d3838 Binary files /dev/null and b/assets/models/custom/shapespark_plants/bush-02/model.bin differ diff --git a/assets/models/custom/shapespark_plants/bush-02/model.gltf b/assets/models/custom/shapespark_plants/bush-02/model.gltf new file mode 100644 index 0000000..07b160b --- /dev/null +++ b/assets/models/custom/shapespark_plants/bush-02/model.gltf @@ -0,0 +1,246 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.5.51", + "version":"2.0" + }, + "extensionsUsed":[ + "KHR_materials_specular", + "KHR_materials_ior" + ], + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Bush-02.001" + } + ], + "materials":[ + { + "alphaMode":"BLEND", + "doubleSided":true, + "extensions":{ + "KHR_materials_specular":{ + "specularFactor":0 + }, + "KHR_materials_ior":{ + "ior":1.4500000476837158 + } + }, + "name":"branch-1-01", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":0 + }, + "metallicFactor":0, + "roughnessFactor":0.5 + } + }, + { + "alphaMode":"BLEND", + "doubleSided":true, + "extensions":{ + "KHR_materials_specular":{ + "specularFactor":0 + }, + "KHR_materials_ior":{ + "ior":1.4500000476837158 + } + }, + "name":"branch-1-02", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "roughnessFactor":0.5 + } + } + ], + "meshes":[ + { + "name":"Plane.001", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + }, + { + "attributes":{ + "POSITION":4, + "NORMAL":5, + "TEXCOORD_0":6 + }, + "indices":7, + "material":1 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"branch-01", + "uri":"../textures/branch-01.png" + }, + { + "mimeType":"image/png", + "name":"branch-02", + "uri":"../textures/branch-02.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":81, + "max":[ + 0.5122456550598145, + 0.8778968453407288, + 0.5435709953308105 + ], + "min":[ + -0.5961732864379883, + 0, + -0.6160855293273926 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":81, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":81, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":216, + "type":"SCALAR" + }, + { + "bufferView":4, + "componentType":5126, + "count":72, + "max":[ + 0.5961732864379883, + 0.8770927786827087, + 0.635948657989502 + ], + "min":[ + -0.4895660877227783, + 0.0037081539630889893, + -0.635948657989502 + ], + "type":"VEC3" + }, + { + "bufferView":5, + "componentType":5126, + "count":72, + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":72, + "type":"VEC2" + }, + { + "bufferView":7, + "componentType":5123, + "count":192, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":972, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":972, + "byteOffset":972, + "target":34962 + }, + { + "buffer":0, + "byteLength":648, + "byteOffset":1944, + "target":34962 + }, + { + "buffer":0, + "byteLength":432, + "byteOffset":2592, + "target":34963 + }, + { + "buffer":0, + "byteLength":864, + "byteOffset":3024, + "target":34962 + }, + { + "buffer":0, + "byteLength":864, + "byteOffset":3888, + "target":34962 + }, + { + "buffer":0, + "byteLength":576, + "byteOffset":4752, + "target":34962 + }, + { + "buffer":0, + "byteLength":384, + "byteOffset":5328, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":5712, + "uri":"model.bin" + } + ] +} diff --git a/assets/models/custom/shapespark_plants/bush-02/preview.png b/assets/models/custom/shapespark_plants/bush-02/preview.png new file mode 100644 index 0000000..7d0d69e Binary files /dev/null and b/assets/models/custom/shapespark_plants/bush-02/preview.png differ diff --git a/assets/models/custom/shapespark_plants/bush-03/model.bin b/assets/models/custom/shapespark_plants/bush-03/model.bin new file mode 100644 index 0000000..671e776 Binary files /dev/null and b/assets/models/custom/shapespark_plants/bush-03/model.bin differ diff --git a/assets/models/custom/shapespark_plants/bush-03/model.gltf b/assets/models/custom/shapespark_plants/bush-03/model.gltf new file mode 100644 index 0000000..b705edf --- /dev/null +++ b/assets/models/custom/shapespark_plants/bush-03/model.gltf @@ -0,0 +1,226 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.5.51", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Bush-03.001" + } + ], + "materials":[ + { + "alphaMode":"BLEND", + "doubleSided":true, + "name":"shrubbery-2-01", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":0 + }, + "metallicFactor":0, + "roughnessFactor":0.5 + } + }, + { + "alphaMode":"BLEND", + "doubleSided":true, + "name":"shrubbery-2-02", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "roughnessFactor":0.5 + } + } + ], + "meshes":[ + { + "name":"Plane.001", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + }, + { + "attributes":{ + "POSITION":4, + "NORMAL":5, + "TEXCOORD_0":6 + }, + "indices":7, + "material":1 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"shrubbery-1-01", + "uri":"../textures/shrubbery-1-01.png" + }, + { + "mimeType":"image/png", + "name":"shrubbery-1-02", + "uri":"../textures/shrubbery-1-02.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":80, + "max":[ + 0.5833921432495117, + 1.0170124769210815, + 0.6101999282836914 + ], + "min":[ + -0.5379180908203125, + 0, + -0.6101999282836914 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":80, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":80, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":120, + "type":"SCALAR" + }, + { + "bufferView":4, + "componentType":5126, + "count":28, + "max":[ + 0.5107007026672363, + 1.0170124769210815, + 0.4259634017944336 + ], + "min":[ + -0.5833921432495117, + 0, + -0.5510902404785156 + ], + "type":"VEC3" + }, + { + "bufferView":5, + "componentType":5126, + "count":28, + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":28, + "type":"VEC2" + }, + { + "bufferView":7, + "componentType":5123, + "count":42, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":960, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":960, + "byteOffset":960, + "target":34962 + }, + { + "buffer":0, + "byteLength":640, + "byteOffset":1920, + "target":34962 + }, + { + "buffer":0, + "byteLength":240, + "byteOffset":2560, + "target":34963 + }, + { + "buffer":0, + "byteLength":336, + "byteOffset":2800, + "target":34962 + }, + { + "buffer":0, + "byteLength":336, + "byteOffset":3136, + "target":34962 + }, + { + "buffer":0, + "byteLength":224, + "byteOffset":3472, + "target":34962 + }, + { + "buffer":0, + "byteLength":84, + "byteOffset":3696, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":3780, + "uri":"model.bin" + } + ] +} diff --git a/assets/models/custom/shapespark_plants/bush-03/preview.png b/assets/models/custom/shapespark_plants/bush-03/preview.png new file mode 100644 index 0000000..bbe739d Binary files /dev/null and b/assets/models/custom/shapespark_plants/bush-03/preview.png differ diff --git a/assets/models/custom/shapespark_plants/bush-04/model.bin b/assets/models/custom/shapespark_plants/bush-04/model.bin new file mode 100644 index 0000000..0cccd30 Binary files /dev/null and b/assets/models/custom/shapespark_plants/bush-04/model.bin differ diff --git a/assets/models/custom/shapespark_plants/bush-04/model.gltf b/assets/models/custom/shapespark_plants/bush-04/model.gltf new file mode 100644 index 0000000..3fc8629 --- /dev/null +++ b/assets/models/custom/shapespark_plants/bush-04/model.gltf @@ -0,0 +1,226 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.5.51", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Bush-04.001" + } + ], + "materials":[ + { + "alphaMode":"BLEND", + "doubleSided":true, + "name":"shrubbery-1-01", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":0 + }, + "metallicFactor":0, + "roughnessFactor":0.5 + } + }, + { + "alphaMode":"BLEND", + "doubleSided":true, + "name":"shrubbery-1-02", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "roughnessFactor":0.5 + } + } + ], + "meshes":[ + { + "name":"Plane.001", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + }, + { + "attributes":{ + "POSITION":4, + "NORMAL":5, + "TEXCOORD_0":6 + }, + "indices":7, + "material":1 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"shrubbery-01", + "uri":"../textures/shrubbery-01.png" + }, + { + "mimeType":"image/png", + "name":"shrubbery-02", + "uri":"../textures/shrubbery-02.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":72, + "max":[ + 0.5833916664123535, + 1.017012357711792, + 0.6101994514465332 + ], + "min":[ + -0.5833921432495117, + 0, + -0.6101994514465332 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":72, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":72, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":108, + "type":"SCALAR" + }, + { + "bufferView":4, + "componentType":5126, + "count":36, + "max":[ + 0.4748873710632324, + 1.017012357711792, + 0.48714447021484375 + ], + "min":[ + -0.5173826217651367, + 0, + -0.5243539810180664 + ], + "type":"VEC3" + }, + { + "bufferView":5, + "componentType":5126, + "count":36, + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":36, + "type":"VEC2" + }, + { + "bufferView":7, + "componentType":5123, + "count":54, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":864, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":864, + "byteOffset":864, + "target":34962 + }, + { + "buffer":0, + "byteLength":576, + "byteOffset":1728, + "target":34962 + }, + { + "buffer":0, + "byteLength":216, + "byteOffset":2304, + "target":34963 + }, + { + "buffer":0, + "byteLength":432, + "byteOffset":2520, + "target":34962 + }, + { + "buffer":0, + "byteLength":432, + "byteOffset":2952, + "target":34962 + }, + { + "buffer":0, + "byteLength":288, + "byteOffset":3384, + "target":34962 + }, + { + "buffer":0, + "byteLength":108, + "byteOffset":3672, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":3780, + "uri":"model.bin" + } + ] +} diff --git a/assets/models/custom/shapespark_plants/bush-04/preview.png b/assets/models/custom/shapespark_plants/bush-04/preview.png new file mode 100644 index 0000000..0032ed9 Binary files /dev/null and b/assets/models/custom/shapespark_plants/bush-04/preview.png differ diff --git a/assets/models/custom/shapespark_plants/bush-05/model.bin b/assets/models/custom/shapespark_plants/bush-05/model.bin new file mode 100644 index 0000000..19c236e Binary files /dev/null and b/assets/models/custom/shapespark_plants/bush-05/model.bin differ diff --git a/assets/models/custom/shapespark_plants/bush-05/model.gltf b/assets/models/custom/shapespark_plants/bush-05/model.gltf new file mode 100644 index 0000000..a8bd9cb --- /dev/null +++ b/assets/models/custom/shapespark_plants/bush-05/model.gltf @@ -0,0 +1,341 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.5.51", + "version":"2.0" + }, + "extensionsUsed":[ + "KHR_materials_specular", + "KHR_materials_ior" + ], + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Bush-05.001" + } + ], + "materials":[ + { + "doubleSided":true, + "extensions":{ + "KHR_materials_specular":{ + "specularFactor":0 + }, + "KHR_materials_ior":{ + "ior":1.4500000476837158 + } + }, + "name":"trunk-01", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":0 + }, + "metallicFactor":0, + "roughnessFactor":0.3431818187236786 + } + }, + { + "alphaMode":"BLEND", + "doubleSided":true, + "extensions":{ + "KHR_materials_specular":{ + "specularFactor":0 + }, + "KHR_materials_ior":{ + "ior":1.4500000476837158 + } + }, + "name":"branch-1-01", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "roughnessFactor":0.5 + } + }, + { + "alphaMode":"BLEND", + "doubleSided":true, + "extensions":{ + "KHR_materials_specular":{ + "specularFactor":0 + }, + "KHR_materials_ior":{ + "ior":1.4500000476837158 + } + }, + "name":"branch-1-02", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":2 + }, + "metallicFactor":0, + "roughnessFactor":0.5 + } + } + ], + "meshes":[ + { + "name":"BezierCurve.001", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + }, + { + "attributes":{ + "POSITION":4, + "NORMAL":5, + "TEXCOORD_0":6 + }, + "indices":7, + "material":1 + }, + { + "attributes":{ + "POSITION":8, + "NORMAL":9, + "TEXCOORD_0":10 + }, + "indices":11, + "material":2 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/jpeg", + "name":"bark", + "uri":"../textures/bark.jpg" + }, + { + "mimeType":"image/png", + "name":"branch-01", + "uri":"../textures/branch-01.png" + }, + { + "mimeType":"image/png", + "name":"branch-02", + "uri":"../textures/branch-02.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":135, + "max":[ + 0.36066222190856934, + 1.9299087524414062, + 0.8855743408203125 + ], + "min":[ + -0.676530122756958, + 0, + -0.3175506591796875 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":135, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":135, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":537, + "type":"SCALAR" + }, + { + "bufferView":4, + "componentType":5126, + "count":162, + "max":[ + 1.9345498085021973, + 2.192629337310791, + 1.7276725769042969 + ], + "min":[ + -2.116325855255127, + 0.05757701396942139, + -2.312786102294922 + ], + "type":"VEC3" + }, + { + "bufferView":5, + "componentType":5126, + "count":162, + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":162, + "type":"VEC2" + }, + { + "bufferView":7, + "componentType":5123, + "count":432, + "type":"SCALAR" + }, + { + "bufferView":8, + "componentType":5126, + "count":261, + "max":[ + 2.116325855255127, + 2.2404303550720215, + 2.3127880096435547 + ], + "min":[ + -1.688843846321106, + 0.008928298950195312, + -2.229969024658203 + ], + "type":"VEC3" + }, + { + "bufferView":9, + "componentType":5126, + "count":261, + "type":"VEC3" + }, + { + "bufferView":10, + "componentType":5126, + "count":261, + "type":"VEC2" + }, + { + "bufferView":11, + "componentType":5123, + "count":696, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":1620, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":1620, + "byteOffset":1620, + "target":34962 + }, + { + "buffer":0, + "byteLength":1080, + "byteOffset":3240, + "target":34962 + }, + { + "buffer":0, + "byteLength":1074, + "byteOffset":4320, + "target":34963 + }, + { + "buffer":0, + "byteLength":1944, + "byteOffset":5396, + "target":34962 + }, + { + "buffer":0, + "byteLength":1944, + "byteOffset":7340, + "target":34962 + }, + { + "buffer":0, + "byteLength":1296, + "byteOffset":9284, + "target":34962 + }, + { + "buffer":0, + "byteLength":864, + "byteOffset":10580, + "target":34963 + }, + { + "buffer":0, + "byteLength":3132, + "byteOffset":11444, + "target":34962 + }, + { + "buffer":0, + "byteLength":3132, + "byteOffset":14576, + "target":34962 + }, + { + "buffer":0, + "byteLength":2088, + "byteOffset":17708, + "target":34962 + }, + { + "buffer":0, + "byteLength":1392, + "byteOffset":19796, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":21188, + "uri":"model.bin" + } + ] +} diff --git a/assets/models/custom/shapespark_plants/bush-05/preview.png b/assets/models/custom/shapespark_plants/bush-05/preview.png new file mode 100644 index 0000000..2daa49f Binary files /dev/null and b/assets/models/custom/shapespark_plants/bush-05/preview.png differ diff --git a/assets/models/custom/shapespark_plants/clover-01/model.bin b/assets/models/custom/shapespark_plants/clover-01/model.bin new file mode 100644 index 0000000..77e9e1c Binary files /dev/null and b/assets/models/custom/shapespark_plants/clover-01/model.bin differ diff --git a/assets/models/custom/shapespark_plants/clover-01/model.gltf b/assets/models/custom/shapespark_plants/clover-01/model.gltf new file mode 100644 index 0000000..139ce79 --- /dev/null +++ b/assets/models/custom/shapespark_plants/clover-01/model.gltf @@ -0,0 +1,150 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.5.51", + "version":"2.0" + }, + "extensionsUsed":[ + "KHR_materials_specular", + "KHR_materials_ior" + ], + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Clover-01.001" + } + ], + "materials":[ + { + "alphaMode":"BLEND", + "doubleSided":true, + "extensions":{ + "KHR_materials_specular":{ + "specularFactor":0.3227272629737854 + }, + "KHR_materials_ior":{ + "ior":1.4500000476837158 + } + }, + "name":"clover-01", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":0 + }, + "metallicFactor":0, + "roughnessFactor":0.5 + } + } + ], + "meshes":[ + { + "name":"Plane.001", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"clover-05", + "uri":"../textures/clover-05.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":13, + "max":[ + 0.8042905330657959, + 0.06880080699920654, + 0.804290771484375 + ], + "min":[ + -0.8042905330657959, + 0, + -0.804290771484375 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":13, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":13, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":15, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":156, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":156, + "byteOffset":156, + "target":34962 + }, + { + "buffer":0, + "byteLength":104, + "byteOffset":312, + "target":34962 + }, + { + "buffer":0, + "byteLength":30, + "byteOffset":416, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":448, + "uri":"model.bin" + } + ] +} diff --git a/assets/models/custom/shapespark_plants/clover-01/preview.png b/assets/models/custom/shapespark_plants/clover-01/preview.png new file mode 100644 index 0000000..b754444 Binary files /dev/null and b/assets/models/custom/shapespark_plants/clover-01/preview.png differ diff --git a/assets/models/custom/shapespark_plants/clover-02/model.bin b/assets/models/custom/shapespark_plants/clover-02/model.bin new file mode 100644 index 0000000..a3542c5 Binary files /dev/null and b/assets/models/custom/shapespark_plants/clover-02/model.bin differ diff --git a/assets/models/custom/shapespark_plants/clover-02/model.gltf b/assets/models/custom/shapespark_plants/clover-02/model.gltf new file mode 100644 index 0000000..36bc578 --- /dev/null +++ b/assets/models/custom/shapespark_plants/clover-02/model.gltf @@ -0,0 +1,150 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.5.51", + "version":"2.0" + }, + "extensionsUsed":[ + "KHR_materials_specular", + "KHR_materials_ior" + ], + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Clover-02.001" + } + ], + "materials":[ + { + "alphaMode":"BLEND", + "doubleSided":true, + "extensions":{ + "KHR_materials_specular":{ + "specularFactor":0.5045454502105713 + }, + "KHR_materials_ior":{ + "ior":1.4500000476837158 + } + }, + "name":"clover-02", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":0 + }, + "metallicFactor":0, + "roughnessFactor":0.5 + } + } + ], + "meshes":[ + { + "name":"Plane.001", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"clover-04", + "uri":"../textures/clover-04.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":12, + "max":[ + 0.8042905330657959, + 0.04400423914194107, + 0.804290771484375 + ], + "min":[ + -0.8042905330657959, + 0, + -0.804290771484375 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":12, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":12, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":12, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":144, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":144, + "byteOffset":144, + "target":34962 + }, + { + "buffer":0, + "byteLength":96, + "byteOffset":288, + "target":34962 + }, + { + "buffer":0, + "byteLength":24, + "byteOffset":384, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":408, + "uri":"model.bin" + } + ] +} diff --git a/assets/models/custom/shapespark_plants/clover-02/preview.png b/assets/models/custom/shapespark_plants/clover-02/preview.png new file mode 100644 index 0000000..a3d8ff1 Binary files /dev/null and b/assets/models/custom/shapespark_plants/clover-02/preview.png differ diff --git a/assets/models/custom/shapespark_plants/clover-03/model.bin b/assets/models/custom/shapespark_plants/clover-03/model.bin new file mode 100644 index 0000000..35c11d1 Binary files /dev/null and b/assets/models/custom/shapespark_plants/clover-03/model.bin differ diff --git a/assets/models/custom/shapespark_plants/clover-03/model.gltf b/assets/models/custom/shapespark_plants/clover-03/model.gltf new file mode 100644 index 0000000..cab257e --- /dev/null +++ b/assets/models/custom/shapespark_plants/clover-03/model.gltf @@ -0,0 +1,150 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.5.51", + "version":"2.0" + }, + "extensionsUsed":[ + "KHR_materials_specular", + "KHR_materials_ior" + ], + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Clover-03.001" + } + ], + "materials":[ + { + "alphaMode":"BLEND", + "doubleSided":true, + "extensions":{ + "KHR_materials_specular":{ + "specularFactor":0.48636364936828613 + }, + "KHR_materials_ior":{ + "ior":1.4500000476837158 + } + }, + "name":"clover-03", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":0 + }, + "metallicFactor":0, + "roughnessFactor":0.5 + } + } + ], + "meshes":[ + { + "name":"Plane.001", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"clover-03", + "uri":"../textures/clover-03.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":13, + "max":[ + 0.8042902946472168, + 0.06880080699920654, + 0.804290771484375 + ], + "min":[ + -0.8042902946472168, + 0, + -0.804290771484375 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":13, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":13, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":15, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":156, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":156, + "byteOffset":156, + "target":34962 + }, + { + "buffer":0, + "byteLength":104, + "byteOffset":312, + "target":34962 + }, + { + "buffer":0, + "byteLength":30, + "byteOffset":416, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":448, + "uri":"model.bin" + } + ] +} diff --git a/assets/models/custom/shapespark_plants/clover-03/preview.png b/assets/models/custom/shapespark_plants/clover-03/preview.png new file mode 100644 index 0000000..823947c Binary files /dev/null and b/assets/models/custom/shapespark_plants/clover-03/preview.png differ diff --git a/assets/models/custom/shapespark_plants/clover-04/model.bin b/assets/models/custom/shapespark_plants/clover-04/model.bin new file mode 100644 index 0000000..4c6156a Binary files /dev/null and b/assets/models/custom/shapespark_plants/clover-04/model.bin differ diff --git a/assets/models/custom/shapespark_plants/clover-04/model.gltf b/assets/models/custom/shapespark_plants/clover-04/model.gltf new file mode 100644 index 0000000..c2ad0e1 --- /dev/null +++ b/assets/models/custom/shapespark_plants/clover-04/model.gltf @@ -0,0 +1,150 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.5.51", + "version":"2.0" + }, + "extensionsUsed":[ + "KHR_materials_specular", + "KHR_materials_ior" + ], + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Clover-04.001" + } + ], + "materials":[ + { + "alphaMode":"BLEND", + "doubleSided":true, + "extensions":{ + "KHR_materials_specular":{ + "specularFactor":0.5181818008422852 + }, + "KHR_materials_ior":{ + "ior":1.4500000476837158 + } + }, + "name":"clover-04", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":0 + }, + "metallicFactor":0, + "roughnessFactor":0.5 + } + } + ], + "meshes":[ + { + "name":"Plane.001", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"clover-02", + "uri":"../textures/clover-02.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":12, + "max":[ + 0.8042902946472168, + 0.11188695579767227, + 0.804290771484375 + ], + "min":[ + -0.8042902946472168, + 0, + -0.804290771484375 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":12, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":12, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":12, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":144, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":144, + "byteOffset":144, + "target":34962 + }, + { + "buffer":0, + "byteLength":96, + "byteOffset":288, + "target":34962 + }, + { + "buffer":0, + "byteLength":24, + "byteOffset":384, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":408, + "uri":"model.bin" + } + ] +} diff --git a/assets/models/custom/shapespark_plants/clover-04/preview.png b/assets/models/custom/shapespark_plants/clover-04/preview.png new file mode 100644 index 0000000..f988d79 Binary files /dev/null and b/assets/models/custom/shapespark_plants/clover-04/preview.png differ diff --git a/assets/models/custom/shapespark_plants/clover-05/model.bin b/assets/models/custom/shapespark_plants/clover-05/model.bin new file mode 100644 index 0000000..9b11b4d Binary files /dev/null and b/assets/models/custom/shapespark_plants/clover-05/model.bin differ diff --git a/assets/models/custom/shapespark_plants/clover-05/model.gltf b/assets/models/custom/shapespark_plants/clover-05/model.gltf new file mode 100644 index 0000000..dea5a27 --- /dev/null +++ b/assets/models/custom/shapespark_plants/clover-05/model.gltf @@ -0,0 +1,150 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.5.51", + "version":"2.0" + }, + "extensionsUsed":[ + "KHR_materials_specular", + "KHR_materials_ior" + ], + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Clover-05.001" + } + ], + "materials":[ + { + "alphaMode":"BLEND", + "doubleSided":true, + "extensions":{ + "KHR_materials_specular":{ + "specularFactor":0.4954545497894287 + }, + "KHR_materials_ior":{ + "ior":1.4500000476837158 + } + }, + "name":"clover-05", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":0 + }, + "metallicFactor":0, + "roughnessFactor":0.5 + } + } + ], + "meshes":[ + { + "name":"Plane.001", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"clover-01", + "uri":"../textures/clover-01.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":12, + "max":[ + 0.8042902946472168, + 0.06880080699920654, + 0.804290771484375 + ], + "min":[ + -0.8042902946472168, + 0, + -0.804290771484375 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":12, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":12, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":12, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":144, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":144, + "byteOffset":144, + "target":34962 + }, + { + "buffer":0, + "byteLength":96, + "byteOffset":288, + "target":34962 + }, + { + "buffer":0, + "byteLength":24, + "byteOffset":384, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":408, + "uri":"model.bin" + } + ] +} diff --git a/assets/models/custom/shapespark_plants/clover-05/preview.png b/assets/models/custom/shapespark_plants/clover-05/preview.png new file mode 100644 index 0000000..698c308 Binary files /dev/null and b/assets/models/custom/shapespark_plants/clover-05/preview.png differ diff --git a/assets/models/custom/shapespark_plants/flowers-01/model.bin b/assets/models/custom/shapespark_plants/flowers-01/model.bin new file mode 100644 index 0000000..45a9507 Binary files /dev/null and b/assets/models/custom/shapespark_plants/flowers-01/model.bin differ diff --git a/assets/models/custom/shapespark_plants/flowers-01/model.gltf b/assets/models/custom/shapespark_plants/flowers-01/model.gltf new file mode 100644 index 0000000..3136ebc --- /dev/null +++ b/assets/models/custom/shapespark_plants/flowers-01/model.gltf @@ -0,0 +1,138 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.5.51", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Flowers-01.001" + } + ], + "materials":[ + { + "alphaMode":"BLEND", + "doubleSided":true, + "name":"flowers-01.001", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":0 + }, + "metallicFactor":0, + "roughnessFactor":0.5 + } + } + ], + "meshes":[ + { + "name":"Plane.001", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"flowers-01", + "uri":"../textures/flowers-01.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":32, + "max":[ + 0.8042905330657959, + 0.0962081104516983, + 0.804290771484375 + ], + "min":[ + -0.8042905330657959, + 0, + -0.804290771484375 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":32, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":32, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":42, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":384, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":384, + "byteOffset":384, + "target":34962 + }, + { + "buffer":0, + "byteLength":256, + "byteOffset":768, + "target":34962 + }, + { + "buffer":0, + "byteLength":84, + "byteOffset":1024, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":1108, + "uri":"model.bin" + } + ] +} diff --git a/assets/models/custom/shapespark_plants/flowers-01/preview.png b/assets/models/custom/shapespark_plants/flowers-01/preview.png new file mode 100644 index 0000000..e265da9 Binary files /dev/null and b/assets/models/custom/shapespark_plants/flowers-01/preview.png differ diff --git a/assets/models/custom/shapespark_plants/flowers-02/model.bin b/assets/models/custom/shapespark_plants/flowers-02/model.bin new file mode 100644 index 0000000..39f1fe1 Binary files /dev/null and b/assets/models/custom/shapespark_plants/flowers-02/model.bin differ diff --git a/assets/models/custom/shapespark_plants/flowers-02/model.gltf b/assets/models/custom/shapespark_plants/flowers-02/model.gltf new file mode 100644 index 0000000..260a7dd --- /dev/null +++ b/assets/models/custom/shapespark_plants/flowers-02/model.gltf @@ -0,0 +1,402 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.5.51", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Flowers-02.001" + } + ], + "materials":[ + { + "alphaMode":"BLEND", + "doubleSided":true, + "name":"flowers-01.001", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":0 + }, + "metallicFactor":0, + "roughnessFactor":0.5 + } + }, + { + "alphaMode":"BLEND", + "doubleSided":true, + "name":"flowers-01.002", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "roughnessFactor":0.5 + } + }, + { + "alphaMode":"BLEND", + "doubleSided":true, + "name":"shrubbery-1-01", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":2 + }, + "metallicFactor":0, + "roughnessFactor":0.5 + } + }, + { + "alphaMode":"BLEND", + "doubleSided":true, + "name":"shrubbery-1-02", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":3 + }, + "metallicFactor":0, + "roughnessFactor":0.5 + } + } + ], + "meshes":[ + { + "name":"Plane.001", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + }, + { + "attributes":{ + "POSITION":4, + "NORMAL":5, + "TEXCOORD_0":6 + }, + "indices":7, + "material":1 + }, + { + "attributes":{ + "POSITION":8, + "NORMAL":9, + "TEXCOORD_0":10 + }, + "indices":11, + "material":2 + }, + { + "attributes":{ + "POSITION":12, + "NORMAL":13, + "TEXCOORD_0":14 + }, + "indices":15, + "material":3 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"flowers-01", + "uri":"../textures/flowers-01.png" + }, + { + "mimeType":"image/png", + "name":"flowers-02", + "uri":"../textures/flowers-02.png" + }, + { + "mimeType":"image/png", + "name":"shrubbery-01", + "uri":"../textures/shrubbery-01.png" + }, + { + "mimeType":"image/png", + "name":"shrubbery-02", + "uri":"../textures/shrubbery-02.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":36, + "max":[ + 0.5630202293395996, + 0.7661895751953125, + 0.5195379257202148 + ], + "min":[ + -0.6329164505004883, + 0.409686803817749, + -0.7071380615234375 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":36, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":36, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":54, + "type":"SCALAR" + }, + { + "bufferView":4, + "componentType":5126, + "count":36, + "max":[ + 0.6526293754577637, + 0.7462631464004517, + 0.5518369674682617 + ], + "min":[ + -0.41998767852783203, + 0.3797542452812195, + -0.5864648818969727 + ], + "type":"VEC3" + }, + { + "bufferView":5, + "componentType":5126, + "count":36, + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":36, + "type":"VEC2" + }, + { + "bufferView":7, + "componentType":5123, + "count":54, + "type":"SCALAR" + }, + { + "bufferView":8, + "componentType":5126, + "count":72, + "max":[ + 0.7357230186462402, + 0.9060201644897461, + 0.7071380615234375 + ], + "min":[ + -0.735722541809082, + 0, + -0.7022256851196289 + ], + "type":"VEC3" + }, + { + "bufferView":9, + "componentType":5126, + "count":72, + "type":"VEC3" + }, + { + "bufferView":10, + "componentType":5126, + "count":72, + "type":"VEC2" + }, + { + "bufferView":11, + "componentType":5123, + "count":108, + "type":"SCALAR" + }, + { + "bufferView":12, + "componentType":5126, + "count":36, + "max":[ + 0.581110954284668, + 0.9545401334762573, + 0.6120939254760742 + ], + "min":[ + -0.7084417343139648, + 0.0038599371910095215, + -0.6311941146850586 + ], + "type":"VEC3" + }, + { + "bufferView":13, + "componentType":5126, + "count":36, + "type":"VEC3" + }, + { + "bufferView":14, + "componentType":5126, + "count":36, + "type":"VEC2" + }, + { + "bufferView":15, + "componentType":5123, + "count":54, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":432, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":432, + "byteOffset":432, + "target":34962 + }, + { + "buffer":0, + "byteLength":288, + "byteOffset":864, + "target":34962 + }, + { + "buffer":0, + "byteLength":108, + "byteOffset":1152, + "target":34963 + }, + { + "buffer":0, + "byteLength":432, + "byteOffset":1260, + "target":34962 + }, + { + "buffer":0, + "byteLength":432, + "byteOffset":1692, + "target":34962 + }, + { + "buffer":0, + "byteLength":288, + "byteOffset":2124, + "target":34962 + }, + { + "buffer":0, + "byteLength":108, + "byteOffset":2412, + "target":34963 + }, + { + "buffer":0, + "byteLength":864, + "byteOffset":2520, + "target":34962 + }, + { + "buffer":0, + "byteLength":864, + "byteOffset":3384, + "target":34962 + }, + { + "buffer":0, + "byteLength":576, + "byteOffset":4248, + "target":34962 + }, + { + "buffer":0, + "byteLength":216, + "byteOffset":4824, + "target":34963 + }, + { + "buffer":0, + "byteLength":432, + "byteOffset":5040, + "target":34962 + }, + { + "buffer":0, + "byteLength":432, + "byteOffset":5472, + "target":34962 + }, + { + "buffer":0, + "byteLength":288, + "byteOffset":5904, + "target":34962 + }, + { + "buffer":0, + "byteLength":108, + "byteOffset":6192, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":6300, + "uri":"model.bin" + } + ] +} diff --git a/assets/models/custom/shapespark_plants/flowers-02/preview.png b/assets/models/custom/shapespark_plants/flowers-02/preview.png new file mode 100644 index 0000000..4cd2809 Binary files /dev/null and b/assets/models/custom/shapespark_plants/flowers-02/preview.png differ diff --git a/assets/models/custom/shapespark_plants/flowers-03/model.bin b/assets/models/custom/shapespark_plants/flowers-03/model.bin new file mode 100644 index 0000000..7c46f6e Binary files /dev/null and b/assets/models/custom/shapespark_plants/flowers-03/model.bin differ diff --git a/assets/models/custom/shapespark_plants/flowers-03/model.gltf b/assets/models/custom/shapespark_plants/flowers-03/model.gltf new file mode 100644 index 0000000..a88b3d9 --- /dev/null +++ b/assets/models/custom/shapespark_plants/flowers-03/model.gltf @@ -0,0 +1,138 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.5.51", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Flowers-03.001" + } + ], + "materials":[ + { + "alphaMode":"BLEND", + "doubleSided":true, + "name":"flowers-01.002", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":0 + }, + "metallicFactor":0, + "roughnessFactor":0.5 + } + } + ], + "meshes":[ + { + "name":"Plane.001", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"flowers-02", + "uri":"../textures/flowers-02.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":34, + "max":[ + 0.8042902946472168, + 0.15777377784252167, + 0.804290771484375 + ], + "min":[ + -0.8042902946472168, + 0, + -0.804290771484375 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":34, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":34, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":48, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":408, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":408, + "byteOffset":408, + "target":34962 + }, + { + "buffer":0, + "byteLength":272, + "byteOffset":816, + "target":34962 + }, + { + "buffer":0, + "byteLength":96, + "byteOffset":1088, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":1184, + "uri":"model.bin" + } + ] +} diff --git a/assets/models/custom/shapespark_plants/flowers-03/preview.png b/assets/models/custom/shapespark_plants/flowers-03/preview.png new file mode 100644 index 0000000..78565b2 Binary files /dev/null and b/assets/models/custom/shapespark_plants/flowers-03/preview.png differ diff --git a/assets/models/custom/shapespark_plants/flowers-04/model.bin b/assets/models/custom/shapespark_plants/flowers-04/model.bin new file mode 100644 index 0000000..e4cd490 Binary files /dev/null and b/assets/models/custom/shapespark_plants/flowers-04/model.bin differ diff --git a/assets/models/custom/shapespark_plants/flowers-04/model.gltf b/assets/models/custom/shapespark_plants/flowers-04/model.gltf new file mode 100644 index 0000000..45d8692 --- /dev/null +++ b/assets/models/custom/shapespark_plants/flowers-04/model.gltf @@ -0,0 +1,402 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.5.51", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Flowers-04.001" + } + ], + "materials":[ + { + "alphaMode":"BLEND", + "doubleSided":true, + "name":"flowers-01.001", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":0 + }, + "metallicFactor":0, + "roughnessFactor":0.5 + } + }, + { + "alphaMode":"BLEND", + "doubleSided":true, + "name":"flowers-01.002", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "roughnessFactor":0.5 + } + }, + { + "alphaMode":"BLEND", + "doubleSided":true, + "name":"shrubbery-1-01", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":2 + }, + "metallicFactor":0, + "roughnessFactor":0.5 + } + }, + { + "alphaMode":"BLEND", + "doubleSided":true, + "name":"shrubbery-1-02", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":3 + }, + "metallicFactor":0, + "roughnessFactor":0.5 + } + } + ], + "meshes":[ + { + "name":"Plane.001", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + }, + { + "attributes":{ + "POSITION":4, + "NORMAL":5, + "TEXCOORD_0":6 + }, + "indices":7, + "material":1 + }, + { + "attributes":{ + "POSITION":8, + "NORMAL":9, + "TEXCOORD_0":10 + }, + "indices":11, + "material":2 + }, + { + "attributes":{ + "POSITION":12, + "NORMAL":13, + "TEXCOORD_0":14 + }, + "indices":15, + "material":3 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"flowers-01", + "uri":"../textures/flowers-01.png" + }, + { + "mimeType":"image/png", + "name":"flowers-02", + "uri":"../textures/flowers-02.png" + }, + { + "mimeType":"image/png", + "name":"shrubbery-01", + "uri":"../textures/shrubbery-01.png" + }, + { + "mimeType":"image/png", + "name":"shrubbery-02", + "uri":"../textures/shrubbery-02.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":36, + "max":[ + 0.4416971206665039, + 0.7731611132621765, + 0.5218057632446289 + ], + "min":[ + -0.551506757736206, + 0.3797275125980377, + -0.5259017944335938 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":36, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":36, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":54, + "type":"SCALAR" + }, + { + "bufferView":4, + "componentType":5126, + "count":36, + "max":[ + 0.6191749572753906, + 0.7363936901092529, + 0.507960319519043 + ], + "min":[ + -0.4534420967102051, + 0.36988475918769836, + -0.6303415298461914 + ], + "type":"VEC3" + }, + { + "bufferView":5, + "componentType":5126, + "count":36, + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":36, + "type":"VEC2" + }, + { + "bufferView":7, + "componentType":5123, + "count":54, + "type":"SCALAR" + }, + { + "bufferView":8, + "componentType":5126, + "count":72, + "max":[ + 0.7048861980438232, + 0.8867557048797607, + 0.7372770309448242 + ], + "min":[ + -0.7048861980438232, + 0, + -0.7372770309448242 + ], + "type":"VEC3" + }, + { + "bufferView":9, + "componentType":5126, + "count":72, + "type":"VEC3" + }, + { + "bufferView":10, + "componentType":5126, + "count":72, + "type":"VEC2" + }, + { + "bufferView":11, + "componentType":5123, + "count":108, + "type":"SCALAR" + }, + { + "bufferView":12, + "componentType":5126, + "count":36, + "max":[ + 0.5737853050231934, + 0.942986249923706, + 0.5885944366455078 + ], + "min":[ + -0.6251299381256104, + 0, + -0.6335535049438477 + ], + "type":"VEC3" + }, + { + "bufferView":13, + "componentType":5126, + "count":36, + "type":"VEC3" + }, + { + "bufferView":14, + "componentType":5126, + "count":36, + "type":"VEC2" + }, + { + "bufferView":15, + "componentType":5123, + "count":54, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":432, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":432, + "byteOffset":432, + "target":34962 + }, + { + "buffer":0, + "byteLength":288, + "byteOffset":864, + "target":34962 + }, + { + "buffer":0, + "byteLength":108, + "byteOffset":1152, + "target":34963 + }, + { + "buffer":0, + "byteLength":432, + "byteOffset":1260, + "target":34962 + }, + { + "buffer":0, + "byteLength":432, + "byteOffset":1692, + "target":34962 + }, + { + "buffer":0, + "byteLength":288, + "byteOffset":2124, + "target":34962 + }, + { + "buffer":0, + "byteLength":108, + "byteOffset":2412, + "target":34963 + }, + { + "buffer":0, + "byteLength":864, + "byteOffset":2520, + "target":34962 + }, + { + "buffer":0, + "byteLength":864, + "byteOffset":3384, + "target":34962 + }, + { + "buffer":0, + "byteLength":576, + "byteOffset":4248, + "target":34962 + }, + { + "buffer":0, + "byteLength":216, + "byteOffset":4824, + "target":34963 + }, + { + "buffer":0, + "byteLength":432, + "byteOffset":5040, + "target":34962 + }, + { + "buffer":0, + "byteLength":432, + "byteOffset":5472, + "target":34962 + }, + { + "buffer":0, + "byteLength":288, + "byteOffset":5904, + "target":34962 + }, + { + "buffer":0, + "byteLength":108, + "byteOffset":6192, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":6300, + "uri":"model.bin" + } + ] +} diff --git a/assets/models/custom/shapespark_plants/flowers-04/preview.png b/assets/models/custom/shapespark_plants/flowers-04/preview.png new file mode 100644 index 0000000..7278270 Binary files /dev/null and b/assets/models/custom/shapespark_plants/flowers-04/preview.png differ diff --git a/assets/models/custom/shapespark_plants/grass-01/model.bin b/assets/models/custom/shapespark_plants/grass-01/model.bin new file mode 100644 index 0000000..ca41019 Binary files /dev/null and b/assets/models/custom/shapespark_plants/grass-01/model.bin differ diff --git a/assets/models/custom/shapespark_plants/grass-01/model.gltf b/assets/models/custom/shapespark_plants/grass-01/model.gltf new file mode 100644 index 0000000..99cecb9 --- /dev/null +++ b/assets/models/custom/shapespark_plants/grass-01/model.gltf @@ -0,0 +1,226 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.5.51", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Grass-01.001" + } + ], + "materials":[ + { + "alphaMode":"BLEND", + "doubleSided":true, + "name":"high-grass-1-02", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":0 + }, + "metallicFactor":0, + "roughnessFactor":0.5 + } + }, + { + "alphaMode":"BLEND", + "doubleSided":true, + "name":"high-grass-1-01", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "roughnessFactor":0.5 + } + } + ], + "meshes":[ + { + "name":"Plane.001", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + }, + { + "attributes":{ + "POSITION":4, + "NORMAL":5, + "TEXCOORD_0":6 + }, + "indices":7, + "material":1 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"grass-02", + "uri":"../textures/grass-02.png" + }, + { + "mimeType":"image/png", + "name":"grass-01", + "uri":"../textures/grass-01.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":12, + "max":[ + 0.5192580223083496, + 1.3420486450195312, + 0.6648273468017578 + ], + "min":[ + -0.5123167037963867, + 0, + -0.6648283004760742 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":12, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":12, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":18, + "type":"SCALAR" + }, + { + "bufferView":4, + "componentType":5126, + "count":8, + "max":[ + 0.6255302429199219, + 1.2000000476837158, + 0.44700050354003906 + ], + "min":[ + -0.6255302429199219, + 0, + -0.26865100860595703 + ], + "type":"VEC3" + }, + { + "bufferView":5, + "componentType":5126, + "count":8, + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":8, + "type":"VEC2" + }, + { + "bufferView":7, + "componentType":5123, + "count":12, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":144, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":144, + "byteOffset":144, + "target":34962 + }, + { + "buffer":0, + "byteLength":96, + "byteOffset":288, + "target":34962 + }, + { + "buffer":0, + "byteLength":36, + "byteOffset":384, + "target":34963 + }, + { + "buffer":0, + "byteLength":96, + "byteOffset":420, + "target":34962 + }, + { + "buffer":0, + "byteLength":96, + "byteOffset":516, + "target":34962 + }, + { + "buffer":0, + "byteLength":64, + "byteOffset":612, + "target":34962 + }, + { + "buffer":0, + "byteLength":24, + "byteOffset":676, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":700, + "uri":"model.bin" + } + ] +} diff --git a/assets/models/custom/shapespark_plants/grass-01/preview.png b/assets/models/custom/shapespark_plants/grass-01/preview.png new file mode 100644 index 0000000..799fd0b Binary files /dev/null and b/assets/models/custom/shapespark_plants/grass-01/preview.png differ diff --git a/assets/models/custom/shapespark_plants/grass-02/model.bin b/assets/models/custom/shapespark_plants/grass-02/model.bin new file mode 100644 index 0000000..37e1157 Binary files /dev/null and b/assets/models/custom/shapespark_plants/grass-02/model.bin differ diff --git a/assets/models/custom/shapespark_plants/grass-02/model.gltf b/assets/models/custom/shapespark_plants/grass-02/model.gltf new file mode 100644 index 0000000..9be9a27 --- /dev/null +++ b/assets/models/custom/shapespark_plants/grass-02/model.gltf @@ -0,0 +1,226 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.5.51", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Grass-02.001" + } + ], + "materials":[ + { + "alphaMode":"BLEND", + "doubleSided":true, + "name":"high-grass-1-01", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":0 + }, + "metallicFactor":0, + "roughnessFactor":0.5 + } + }, + { + "alphaMode":"BLEND", + "doubleSided":true, + "name":"high-grass-1-02", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "roughnessFactor":0.5 + } + } + ], + "meshes":[ + { + "name":"Plane.001", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + }, + { + "attributes":{ + "POSITION":4, + "NORMAL":5, + "TEXCOORD_0":6 + }, + "indices":7, + "material":1 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"grass-01", + "uri":"../textures/grass-01.png" + }, + { + "mimeType":"image/png", + "name":"grass-02", + "uri":"../textures/grass-02.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":8, + "max":[ + 0.6255302429199219, + 1.2000000476837158, + 0.6648273468017578 + ], + "min":[ + -0.5337588787078857, + 0, + -0.6648283004760742 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":8, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":8, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":12, + "type":"SCALAR" + }, + { + "bufferView":4, + "componentType":5126, + "count":12, + "max":[ + 0.5744695663452148, + 1.3420486450195312, + 0.6049365997314453 + ], + "min":[ + -0.6255302429199219, + 0, + -0.5248737335205078 + ], + "type":"VEC3" + }, + { + "bufferView":5, + "componentType":5126, + "count":12, + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":12, + "type":"VEC2" + }, + { + "bufferView":7, + "componentType":5123, + "count":18, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":96, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":96, + "byteOffset":96, + "target":34962 + }, + { + "buffer":0, + "byteLength":64, + "byteOffset":192, + "target":34962 + }, + { + "buffer":0, + "byteLength":24, + "byteOffset":256, + "target":34963 + }, + { + "buffer":0, + "byteLength":144, + "byteOffset":280, + "target":34962 + }, + { + "buffer":0, + "byteLength":144, + "byteOffset":424, + "target":34962 + }, + { + "buffer":0, + "byteLength":96, + "byteOffset":568, + "target":34962 + }, + { + "buffer":0, + "byteLength":36, + "byteOffset":664, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":700, + "uri":"model.bin" + } + ] +} diff --git a/assets/models/custom/shapespark_plants/grass-02/preview.png b/assets/models/custom/shapespark_plants/grass-02/preview.png new file mode 100644 index 0000000..f7de394 Binary files /dev/null and b/assets/models/custom/shapespark_plants/grass-02/preview.png differ diff --git a/assets/models/custom/shapespark_plants/grass-03/model.bin b/assets/models/custom/shapespark_plants/grass-03/model.bin new file mode 100644 index 0000000..48c4aad Binary files /dev/null and b/assets/models/custom/shapespark_plants/grass-03/model.bin differ diff --git a/assets/models/custom/shapespark_plants/grass-03/model.gltf b/assets/models/custom/shapespark_plants/grass-03/model.gltf new file mode 100644 index 0000000..9a6cea8 --- /dev/null +++ b/assets/models/custom/shapespark_plants/grass-03/model.gltf @@ -0,0 +1,226 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.5.51", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Grass-03.001" + } + ], + "materials":[ + { + "alphaMode":"BLEND", + "doubleSided":true, + "name":"high-grass-1-01", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":0 + }, + "metallicFactor":0, + "roughnessFactor":0.5 + } + }, + { + "alphaMode":"BLEND", + "doubleSided":true, + "name":"high-grass-1-02", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "roughnessFactor":0.5 + } + } + ], + "meshes":[ + { + "name":"Plane.001", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + }, + { + "attributes":{ + "POSITION":4, + "NORMAL":5, + "TEXCOORD_0":6 + }, + "indices":7, + "material":1 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"grass-01", + "uri":"../textures/grass-01.png" + }, + { + "mimeType":"image/png", + "name":"grass-02", + "uri":"../textures/grass-02.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":8, + "max":[ + 0.5884900093078613, + 1.2000000476837158, + 0.6648273468017578 + ], + "min":[ + -0.7082138061523438, + 0, + -0.6648283004760742 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":8, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":8, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":12, + "type":"SCALAR" + }, + { + "bufferView":4, + "componentType":5126, + "count":12, + "max":[ + 0.7082138061523438, + 1.2000000476837158, + 0.6304864883422852 + ], + "min":[ + -0.6625704765319824, + 0, + -0.5517873764038086 + ], + "type":"VEC3" + }, + { + "bufferView":5, + "componentType":5126, + "count":12, + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":12, + "type":"VEC2" + }, + { + "bufferView":7, + "componentType":5123, + "count":18, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":96, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":96, + "byteOffset":96, + "target":34962 + }, + { + "buffer":0, + "byteLength":64, + "byteOffset":192, + "target":34962 + }, + { + "buffer":0, + "byteLength":24, + "byteOffset":256, + "target":34963 + }, + { + "buffer":0, + "byteLength":144, + "byteOffset":280, + "target":34962 + }, + { + "buffer":0, + "byteLength":144, + "byteOffset":424, + "target":34962 + }, + { + "buffer":0, + "byteLength":96, + "byteOffset":568, + "target":34962 + }, + { + "buffer":0, + "byteLength":36, + "byteOffset":664, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":700, + "uri":"model.bin" + } + ] +} diff --git a/assets/models/custom/shapespark_plants/grass-03/preview.png b/assets/models/custom/shapespark_plants/grass-03/preview.png new file mode 100644 index 0000000..1ac70e3 Binary files /dev/null and b/assets/models/custom/shapespark_plants/grass-03/preview.png differ diff --git a/assets/models/custom/shapespark_plants/hedge-01/model.bin b/assets/models/custom/shapespark_plants/hedge-01/model.bin new file mode 100644 index 0000000..7c9f0fa Binary files /dev/null and b/assets/models/custom/shapespark_plants/hedge-01/model.bin differ diff --git a/assets/models/custom/shapespark_plants/hedge-01/model.gltf b/assets/models/custom/shapespark_plants/hedge-01/model.gltf new file mode 100644 index 0000000..7722a93 --- /dev/null +++ b/assets/models/custom/shapespark_plants/hedge-01/model.gltf @@ -0,0 +1,238 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.5.51", + "version":"2.0" + }, + "extensionsUsed":[ + "KHR_materials_specular", + "KHR_materials_ior" + ], + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Hedge-01.001" + } + ], + "materials":[ + { + "alphaMode":"BLEND", + "doubleSided":true, + "name":"hedge-01", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":0 + }, + "metallicFactor":0, + "roughnessFactor":0.5 + } + }, + { + "alphaMode":"BLEND", + "doubleSided":true, + "extensions":{ + "KHR_materials_specular":{ + "specularFactor":0 + }, + "KHR_materials_ior":{ + "ior":1.4500000476837158 + } + }, + "name":"hedge-02", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "roughnessFactor":0.5 + } + } + ], + "meshes":[ + { + "name":"Plane.001", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + }, + { + "attributes":{ + "POSITION":4, + "NORMAL":5, + "TEXCOORD_0":6 + }, + "indices":7, + "material":1 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"hedge-01", + "uri":"../textures/hedge-01.png" + }, + { + "mimeType":"image/png", + "name":"hedge-02", + "uri":"../textures/hedge-02.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":260, + "max":[ + 1.5853028297424316, + 1.3667086362838745, + 0.9185185432434082 + ], + "min":[ + -1.5853028297424316, + 0.007001757621765137, + -0.9185187816619873 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":260, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":260, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":324, + "type":"SCALAR" + }, + { + "bufferView":4, + "componentType":5126, + "count":304, + "max":[ + 1.1624417304992676, + 1.4072597026824951, + 0.7758388519287109 + ], + "min":[ + -1.3045625686645508, + 0, + -0.7171168327331543 + ], + "type":"VEC3" + }, + { + "bufferView":5, + "componentType":5126, + "count":304, + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":304, + "type":"VEC2" + }, + { + "bufferView":7, + "componentType":5123, + "count":408, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":3120, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":3120, + "byteOffset":3120, + "target":34962 + }, + { + "buffer":0, + "byteLength":2080, + "byteOffset":6240, + "target":34962 + }, + { + "buffer":0, + "byteLength":648, + "byteOffset":8320, + "target":34963 + }, + { + "buffer":0, + "byteLength":3648, + "byteOffset":8968, + "target":34962 + }, + { + "buffer":0, + "byteLength":3648, + "byteOffset":12616, + "target":34962 + }, + { + "buffer":0, + "byteLength":2432, + "byteOffset":16264, + "target":34962 + }, + { + "buffer":0, + "byteLength":816, + "byteOffset":18696, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":19512, + "uri":"model.bin" + } + ] +} diff --git a/assets/models/custom/shapespark_plants/hedge-01/preview.png b/assets/models/custom/shapespark_plants/hedge-01/preview.png new file mode 100644 index 0000000..03e9d78 Binary files /dev/null and b/assets/models/custom/shapespark_plants/hedge-01/preview.png differ diff --git a/assets/models/custom/shapespark_plants/index.html b/assets/models/custom/shapespark_plants/index.html new file mode 100644 index 0000000..9eb70c1 --- /dev/null +++ b/assets/models/custom/shapespark_plants/index.html @@ -0,0 +1,45 @@ + + + +Shapespark plants + +
+
Bush-01

Bush-01

144 verts / 128 tris

1.2465 x 1.1971 x 0.8849 m

+
Bush-02

Bush-02

153 verts / 136 tris

1.1923 x 1.2719 x 0.8779 m

+
Bush-03

Bush-03

86 verts / 54 tris

1.1668 x 1.2204 x 1.017 m

+
Bush-04

Bush-04

86 verts / 54 tris

1.1668 x 1.2204 x 1.017 m

+
Bush-05

Bush-05

518 verts / 555 tris

4.2327 x 4.6256 x 2.2404 m

+
Clover-01

Clover-01

6 verts / 5 tris

1.6086 x 1.6086 x 0.0688 m

+
Clover-02

Clover-02

5 verts / 4 tris

1.6086 x 1.6086 x 0.044 m

+
Clover-03

Clover-03

6 verts / 5 tris

1.6086 x 1.6086 x 0.0688 m

+
Clover-04

Clover-04

5 verts / 4 tris

1.6086 x 1.6086 x 0.1119 m

+
Clover-05

Clover-05

5 verts / 4 tris

1.6086 x 1.6086 x 0.0688 m

+
Flowers-01

Flowers-01

12 verts / 14 tris

1.6086 x 1.6086 x 0.0962 m

+
Flowers-02

Flowers-02

118 verts / 90 tris

1.4714 x 1.4143 x 0.9545 m

+
Flowers-03

Flowers-03

14 verts / 16 tris

1.6086 x 1.6086 x 0.1578 m

+
Flowers-04

Flowers-04

118 verts / 90 tris

1.4098 x 1.4746 x 0.943 m

+
Grass-01

Grass-01

20 verts / 10 tris

1.2511 x 1.3297 x 1.342 m

+
Grass-02

Grass-02

20 verts / 10 tris

1.2511 x 1.3297 x 1.342 m

+
Grass-03

Grass-03

20 verts / 10 tris

1.4164 x 1.3297 x 1.2 m

+
Hedge-01

Hedge-01

303 verts / 244 tris

3.1706 x 1.837 x 1.4073 m

+
Tree-01-1

Tree-01-1

593 verts / 646 tris

5.0591 x 6.1671 x 7.3892 m

+
Tree-01-2

Tree-01-2

593 verts / 646 tris

6.5504 x 7.3164 x 7.5009 m

+
Tree-01-3

Tree-01-3

384 verts / 412 tris

7.2705 x 6.2092 x 7.5105 m

+
Tree-01-4

Tree-01-4

342 verts / 368 tris

4.7164 x 4.0206 x 5.4053 m

+
Tree-02-1

Tree-02-1

593 verts / 646 tris

5.6407 x 5.7064 x 7.3892 m

+
Tree-02-2

Tree-02-2

593 verts / 646 tris

5.742 x 6.6093 x 7.9879 m

+
Tree-02-3

Tree-02-3

384 verts / 412 tris

5.5731 x 5.2682 x 6.8525 m

+
Tree-02-4

Tree-02-4

352 verts / 376 tris

3.8406 x 4.3977 x 5.486 m

+
Tree-03-1

Tree-03-1

593 verts / 646 tris

5.9955 x 5.7332 x 8.7781 m

+
Tree-03-2

Tree-03-2

593 verts / 646 tris

6.5911 x 6.6278 x 8.6844 m

+
Tree-03-3

Tree-03-3

384 verts / 412 tris

6.6659 x 5.6831 x 7.6067 m

+
Tree-03-4

Tree-03-4

352 verts / 376 tris

4.5865 x 4.3651 x 6.4116 m

+
+ diff --git a/assets/models/custom/shapespark_plants/manifest.json b/assets/models/custom/shapespark_plants/manifest.json new file mode 100644 index 0000000..0540fec --- /dev/null +++ b/assets/models/custom/shapespark_plants/manifest.json @@ -0,0 +1,766 @@ +{ + "source": "/Users/que01/Downloads/shapespark-low-poly-plants-kit.blend", + "layout": "Each asset has model.gltf/model.bin/preview.png; textures are shared in ../textures.", + "assets": [ + { + "id": "bush-01", + "name": "Bush-01", + "category": "bush", + "model": "bush-01/model.gltf", + "bin": "bush-01/model.bin", + "preview": "bush-01/preview.png", + "metrics": { + "vertices": 144, + "faces": 64, + "triangles": 128, + "dimensions": [ + 1.2465, + 1.1971, + 0.8849 + ], + "materials": [ + "branch-1-01", + "branch-1-02" + ] + } + }, + { + "id": "bush-02", + "name": "Bush-02", + "category": "bush", + "model": "bush-02/model.gltf", + "bin": "bush-02/model.bin", + "preview": "bush-02/preview.png", + "metrics": { + "vertices": 153, + "faces": 68, + "triangles": 136, + "dimensions": [ + 1.1923, + 1.2719, + 0.8779 + ], + "materials": [ + "branch-1-01", + "branch-1-02" + ] + } + }, + { + "id": "bush-03", + "name": "Bush-03", + "category": "bush", + "model": "bush-03/model.gltf", + "bin": "bush-03/model.bin", + "preview": "bush-03/preview.png", + "metrics": { + "vertices": 86, + "faces": 27, + "triangles": 54, + "dimensions": [ + 1.1668, + 1.2204, + 1.017 + ], + "materials": [ + "shrubbery-2-01", + "shrubbery-2-02" + ] + } + }, + { + "id": "bush-04", + "name": "Bush-04", + "category": "bush", + "model": "bush-04/model.gltf", + "bin": "bush-04/model.bin", + "preview": "bush-04/preview.png", + "metrics": { + "vertices": 86, + "faces": 27, + "triangles": 54, + "dimensions": [ + 1.1668, + 1.2204, + 1.017 + ], + "materials": [ + "shrubbery-1-01", + "shrubbery-1-02" + ] + } + }, + { + "id": "bush-05", + "name": "Bush-05", + "category": "bush", + "model": "bush-05/model.gltf", + "bin": "bush-05/model.bin", + "preview": "bush-05/preview.png", + "metrics": { + "vertices": 518, + "faces": 290, + "triangles": 555, + "dimensions": [ + 4.2327, + 4.6256, + 2.2404 + ], + "materials": [ + "trunk-01", + "branch-1-01", + "branch-1-02" + ] + } + }, + { + "id": "clover-01", + "name": "Clover-01", + "category": "clover", + "model": "clover-01/model.gltf", + "bin": "clover-01/model.bin", + "preview": "clover-01/preview.png", + "metrics": { + "vertices": 6, + "faces": 4, + "triangles": 5, + "dimensions": [ + 1.6086, + 1.6086, + 0.0688 + ], + "materials": [ + "clover-01" + ] + } + }, + { + "id": "clover-02", + "name": "Clover-02", + "category": "clover", + "model": "clover-02/model.gltf", + "bin": "clover-02/model.bin", + "preview": "clover-02/preview.png", + "metrics": { + "vertices": 5, + "faces": 4, + "triangles": 4, + "dimensions": [ + 1.6086, + 1.6086, + 0.044 + ], + "materials": [ + "clover-02" + ] + } + }, + { + "id": "clover-03", + "name": "Clover-03", + "category": "clover", + "model": "clover-03/model.gltf", + "bin": "clover-03/model.bin", + "preview": "clover-03/preview.png", + "metrics": { + "vertices": 6, + "faces": 4, + "triangles": 5, + "dimensions": [ + 1.6086, + 1.6086, + 0.0688 + ], + "materials": [ + "clover-03" + ] + } + }, + { + "id": "clover-04", + "name": "Clover-04", + "category": "clover", + "model": "clover-04/model.gltf", + "bin": "clover-04/model.bin", + "preview": "clover-04/preview.png", + "metrics": { + "vertices": 5, + "faces": 4, + "triangles": 4, + "dimensions": [ + 1.6086, + 1.6086, + 0.1119 + ], + "materials": [ + "clover-04" + ] + } + }, + { + "id": "clover-05", + "name": "Clover-05", + "category": "clover", + "model": "clover-05/model.gltf", + "bin": "clover-05/model.bin", + "preview": "clover-05/preview.png", + "metrics": { + "vertices": 5, + "faces": 4, + "triangles": 4, + "dimensions": [ + 1.6086, + 1.6086, + 0.0688 + ], + "materials": [ + "clover-05" + ] + } + }, + { + "id": "flowers-01", + "name": "Flowers-01", + "category": "flowers", + "model": "flowers-01/model.gltf", + "bin": "flowers-01/model.bin", + "preview": "flowers-01/preview.png", + "metrics": { + "vertices": 12, + "faces": 9, + "triangles": 14, + "dimensions": [ + 1.6086, + 1.6086, + 0.0962 + ], + "materials": [ + "flowers-01.001" + ] + } + }, + { + "id": "flowers-02", + "name": "Flowers-02", + "category": "flowers", + "model": "flowers-02/model.gltf", + "bin": "flowers-02/model.bin", + "preview": "flowers-02/preview.png", + "metrics": { + "vertices": 118, + "faces": 45, + "triangles": 90, + "dimensions": [ + 1.4714, + 1.4143, + 0.9545 + ], + "materials": [ + "flowers-01.001", + "flowers-01.002", + "shrubbery-1-01", + "shrubbery-1-02" + ] + } + }, + { + "id": "flowers-03", + "name": "Flowers-03", + "category": "flowers", + "model": "flowers-03/model.gltf", + "bin": "flowers-03/model.bin", + "preview": "flowers-03/preview.png", + "metrics": { + "vertices": 14, + "faces": 9, + "triangles": 16, + "dimensions": [ + 1.6086, + 1.6086, + 0.1578 + ], + "materials": [ + "flowers-01.002" + ] + } + }, + { + "id": "flowers-04", + "name": "Flowers-04", + "category": "flowers", + "model": "flowers-04/model.gltf", + "bin": "flowers-04/model.bin", + "preview": "flowers-04/preview.png", + "metrics": { + "vertices": 118, + "faces": 45, + "triangles": 90, + "dimensions": [ + 1.4098, + 1.4746, + 0.943 + ], + "materials": [ + "flowers-01.001", + "flowers-01.002", + "shrubbery-1-01", + "shrubbery-1-02" + ] + } + }, + { + "id": "grass-01", + "name": "Grass-01", + "category": "grass", + "model": "grass-01/model.gltf", + "bin": "grass-01/model.bin", + "preview": "grass-01/preview.png", + "metrics": { + "vertices": 20, + "faces": 5, + "triangles": 10, + "dimensions": [ + 1.2511, + 1.3297, + 1.342 + ], + "materials": [ + "high-grass-1-02", + "high-grass-1-01" + ] + } + }, + { + "id": "grass-02", + "name": "Grass-02", + "category": "grass", + "model": "grass-02/model.gltf", + "bin": "grass-02/model.bin", + "preview": "grass-02/preview.png", + "metrics": { + "vertices": 20, + "faces": 5, + "triangles": 10, + "dimensions": [ + 1.2511, + 1.3297, + 1.342 + ], + "materials": [ + "high-grass-1-01", + "high-grass-1-02" + ] + } + }, + { + "id": "grass-03", + "name": "Grass-03", + "category": "grass", + "model": "grass-03/model.gltf", + "bin": "grass-03/model.bin", + "preview": "grass-03/preview.png", + "metrics": { + "vertices": 20, + "faces": 5, + "triangles": 10, + "dimensions": [ + 1.4164, + 1.3297, + 1.2 + ], + "materials": [ + "high-grass-1-01", + "high-grass-1-02" + ] + } + }, + { + "id": "hedge-01", + "name": "Hedge-01", + "category": "hedge", + "model": "hedge-01/model.gltf", + "bin": "hedge-01/model.bin", + "preview": "hedge-01/preview.png", + "metrics": { + "vertices": 303, + "faces": 160, + "triangles": 244, + "dimensions": [ + 3.1706, + 1.837, + 1.4073 + ], + "materials": [ + "hedge-01", + "hedge-02" + ] + } + }, + { + "id": "tree-01-1", + "name": "Tree-01-1", + "category": "tree", + "model": "tree-01-1/model.gltf", + "bin": "tree-01-1/model.bin", + "preview": "tree-01-1/preview.png", + "metrics": { + "vertices": 593, + "faces": 338, + "triangles": 646, + "dimensions": [ + 5.0591, + 6.1671, + 7.3892 + ], + "materials": [ + "trunk-01", + "branch-1-01", + "branch-1-02" + ] + } + }, + { + "id": "tree-01-2", + "name": "Tree-01-2", + "category": "tree", + "model": "tree-01-2/model.gltf", + "bin": "tree-01-2/model.bin", + "preview": "tree-01-2/preview.png", + "metrics": { + "vertices": 593, + "faces": 338, + "triangles": 646, + "dimensions": [ + 6.5504, + 7.3164, + 7.5009 + ], + "materials": [ + "trunk-01", + "branch-1-01", + "branch-1-02" + ] + } + }, + { + "id": "tree-01-3", + "name": "Tree-01-3", + "category": "tree", + "model": "tree-01-3/model.gltf", + "bin": "tree-01-3/model.bin", + "preview": "tree-01-3/preview.png", + "metrics": { + "vertices": 384, + "faces": 213, + "triangles": 412, + "dimensions": [ + 7.2705, + 6.2092, + 7.5105 + ], + "materials": [ + "trunk-01", + "branch-1-02", + "branch-1-01" + ] + } + }, + { + "id": "tree-01-4", + "name": "Tree-01-4", + "category": "tree", + "model": "tree-01-4/model.gltf", + "bin": "tree-01-4/model.bin", + "preview": "tree-01-4/preview.png", + "metrics": { + "vertices": 342, + "faces": 191, + "triangles": 368, + "dimensions": [ + 4.7164, + 4.0206, + 5.4053 + ], + "materials": [ + "trunk-01", + "branch-1-01", + "branch-1-02" + ] + } + }, + { + "id": "tree-02-1", + "name": "Tree-02-1", + "category": "tree", + "model": "tree-02-1/model.gltf", + "bin": "tree-02-1/model.bin", + "preview": "tree-02-1/preview.png", + "metrics": { + "vertices": 593, + "faces": 338, + "triangles": 646, + "dimensions": [ + 5.6407, + 5.7064, + 7.3892 + ], + "materials": [ + "trunk-01", + "branch-2-01", + "branch-2-02" + ] + } + }, + { + "id": "tree-02-2", + "name": "Tree-02-2", + "category": "tree", + "model": "tree-02-2/model.gltf", + "bin": "tree-02-2/model.bin", + "preview": "tree-02-2/preview.png", + "metrics": { + "vertices": 593, + "faces": 338, + "triangles": 646, + "dimensions": [ + 5.742, + 6.6093, + 7.9879 + ], + "materials": [ + "trunk-01", + "branch-2-01", + "branch-2-02" + ] + } + }, + { + "id": "tree-02-3", + "name": "Tree-02-3", + "category": "tree", + "model": "tree-02-3/model.gltf", + "bin": "tree-02-3/model.bin", + "preview": "tree-02-3/preview.png", + "metrics": { + "vertices": 384, + "faces": 213, + "triangles": 412, + "dimensions": [ + 5.5731, + 5.2682, + 6.8525 + ], + "materials": [ + "trunk-01", + "branch-2-01", + "branch-2-02" + ] + } + }, + { + "id": "tree-02-4", + "name": "Tree-02-4", + "category": "tree", + "model": "tree-02-4/model.gltf", + "bin": "tree-02-4/model.bin", + "preview": "tree-02-4/preview.png", + "metrics": { + "vertices": 352, + "faces": 195, + "triangles": 376, + "dimensions": [ + 3.8406, + 4.3977, + 5.486 + ], + "materials": [ + "trunk-01", + "branch-2-01", + "branch-2-02" + ] + } + }, + { + "id": "tree-03-1", + "name": "Tree-03-1", + "category": "tree", + "model": "tree-03-1/model.gltf", + "bin": "tree-03-1/model.bin", + "preview": "tree-03-1/preview.png", + "metrics": { + "vertices": 593, + "faces": 338, + "triangles": 646, + "dimensions": [ + 5.9955, + 5.7332, + 8.7781 + ], + "materials": [ + "trunk-01", + "branch-01", + "branch-02" + ] + } + }, + { + "id": "tree-03-2", + "name": "Tree-03-2", + "category": "tree", + "model": "tree-03-2/model.gltf", + "bin": "tree-03-2/model.bin", + "preview": "tree-03-2/preview.png", + "metrics": { + "vertices": 593, + "faces": 338, + "triangles": 646, + "dimensions": [ + 6.5911, + 6.6278, + 8.6844 + ], + "materials": [ + "trunk-01", + "branch-01", + "branch-02" + ] + } + }, + { + "id": "tree-03-3", + "name": "Tree-03-3", + "category": "tree", + "model": "tree-03-3/model.gltf", + "bin": "tree-03-3/model.bin", + "preview": "tree-03-3/preview.png", + "metrics": { + "vertices": 384, + "faces": 213, + "triangles": 412, + "dimensions": [ + 6.6659, + 5.6831, + 7.6067 + ], + "materials": [ + "trunk-01", + "branch-01", + "branch-02" + ] + } + }, + { + "id": "tree-03-4", + "name": "Tree-03-4", + "category": "tree", + "model": "tree-03-4/model.gltf", + "bin": "tree-03-4/model.bin", + "preview": "tree-03-4/preview.png", + "metrics": { + "vertices": 352, + "faces": 195, + "triangles": 376, + "dimensions": [ + 4.5865, + 4.3651, + 6.4116 + ], + "materials": [ + "trunk-01", + "branch-01", + "branch-02" + ] + } + } + ], + "textures": [ + { + "file": "textures/bark.jpg", + "bytes": 232440 + }, + { + "file": "textures/branch-01.png", + "bytes": 526336 + }, + { + "file": "textures/branch-02.png", + "bytes": 771356 + }, + { + "file": "textures/branch-1-01.png", + "bytes": 825196 + }, + { + "file": "textures/branch-1-02.png", + "bytes": 841532 + }, + { + "file": "textures/branch-2-01.png", + "bytes": 768007 + }, + { + "file": "textures/branch-2-02.png", + "bytes": 855059 + }, + { + "file": "textures/clover-01.png", + "bytes": 1128095 + }, + { + "file": "textures/clover-02.png", + "bytes": 971087 + }, + { + "file": "textures/clover-03.png", + "bytes": 882430 + }, + { + "file": "textures/clover-04.png", + "bytes": 666687 + }, + { + "file": "textures/clover-05.png", + "bytes": 1279496 + }, + { + "file": "textures/flowers-01.png", + "bytes": 780936 + }, + { + "file": "textures/flowers-02.png", + "bytes": 898487 + }, + { + "file": "textures/grass-01.png", + "bytes": 870011 + }, + { + "file": "textures/grass-02.png", + "bytes": 961789 + }, + { + "file": "textures/hedge-01.png", + "bytes": 1023724 + }, + { + "file": "textures/hedge-02.png", + "bytes": 757241 + }, + { + "file": "textures/shrubbery-01.png", + "bytes": 1004253 + }, + { + "file": "textures/shrubbery-02.png", + "bytes": 936556 + }, + { + "file": "textures/shrubbery-1-01.png", + "bytes": 1524314 + }, + { + "file": "textures/shrubbery-1-02.png", + "bytes": 1299766 + } + ] +} \ No newline at end of file diff --git a/assets/models/custom/shapespark_plants/textures/bark.jpg b/assets/models/custom/shapespark_plants/textures/bark.jpg new file mode 100644 index 0000000..bf3b107 Binary files /dev/null and b/assets/models/custom/shapespark_plants/textures/bark.jpg differ diff --git a/assets/models/custom/shapespark_plants/textures/branch-01.png b/assets/models/custom/shapespark_plants/textures/branch-01.png new file mode 100644 index 0000000..e7fdc1a Binary files /dev/null and b/assets/models/custom/shapespark_plants/textures/branch-01.png differ diff --git a/assets/models/custom/shapespark_plants/textures/branch-02.png b/assets/models/custom/shapespark_plants/textures/branch-02.png new file mode 100644 index 0000000..28e2385 Binary files /dev/null and b/assets/models/custom/shapespark_plants/textures/branch-02.png differ diff --git a/assets/models/custom/shapespark_plants/textures/branch-1-01.png b/assets/models/custom/shapespark_plants/textures/branch-1-01.png new file mode 100644 index 0000000..9df8948 Binary files /dev/null and b/assets/models/custom/shapespark_plants/textures/branch-1-01.png differ diff --git a/assets/models/custom/shapespark_plants/textures/branch-1-02.png b/assets/models/custom/shapespark_plants/textures/branch-1-02.png new file mode 100644 index 0000000..a9608b5 Binary files /dev/null and b/assets/models/custom/shapespark_plants/textures/branch-1-02.png differ diff --git a/assets/models/custom/shapespark_plants/textures/branch-2-01.png b/assets/models/custom/shapespark_plants/textures/branch-2-01.png new file mode 100644 index 0000000..bf23b5e Binary files /dev/null and b/assets/models/custom/shapespark_plants/textures/branch-2-01.png differ diff --git a/assets/models/custom/shapespark_plants/textures/branch-2-02.png b/assets/models/custom/shapespark_plants/textures/branch-2-02.png new file mode 100644 index 0000000..d6e2661 Binary files /dev/null and b/assets/models/custom/shapespark_plants/textures/branch-2-02.png differ diff --git a/assets/models/custom/shapespark_plants/textures/clover-01.png b/assets/models/custom/shapespark_plants/textures/clover-01.png new file mode 100644 index 0000000..02f90ed Binary files /dev/null and b/assets/models/custom/shapespark_plants/textures/clover-01.png differ diff --git a/assets/models/custom/shapespark_plants/textures/clover-02.png b/assets/models/custom/shapespark_plants/textures/clover-02.png new file mode 100644 index 0000000..4d290c6 Binary files /dev/null and b/assets/models/custom/shapespark_plants/textures/clover-02.png differ diff --git a/assets/models/custom/shapespark_plants/textures/clover-03.png b/assets/models/custom/shapespark_plants/textures/clover-03.png new file mode 100644 index 0000000..ef91e54 Binary files /dev/null and b/assets/models/custom/shapespark_plants/textures/clover-03.png differ diff --git a/assets/models/custom/shapespark_plants/textures/clover-04.png b/assets/models/custom/shapespark_plants/textures/clover-04.png new file mode 100644 index 0000000..8b436c7 Binary files /dev/null and b/assets/models/custom/shapespark_plants/textures/clover-04.png differ diff --git a/assets/models/custom/shapespark_plants/textures/clover-05.png b/assets/models/custom/shapespark_plants/textures/clover-05.png new file mode 100644 index 0000000..74d460c Binary files /dev/null and b/assets/models/custom/shapespark_plants/textures/clover-05.png differ diff --git a/assets/models/custom/shapespark_plants/textures/flowers-01.png b/assets/models/custom/shapespark_plants/textures/flowers-01.png new file mode 100644 index 0000000..629a822 Binary files /dev/null and b/assets/models/custom/shapespark_plants/textures/flowers-01.png differ diff --git a/assets/models/custom/shapespark_plants/textures/flowers-02.png b/assets/models/custom/shapespark_plants/textures/flowers-02.png new file mode 100644 index 0000000..683f3e5 Binary files /dev/null and b/assets/models/custom/shapespark_plants/textures/flowers-02.png differ diff --git a/assets/models/custom/shapespark_plants/textures/grass-01.png b/assets/models/custom/shapespark_plants/textures/grass-01.png new file mode 100644 index 0000000..037bc7a Binary files /dev/null and b/assets/models/custom/shapespark_plants/textures/grass-01.png differ diff --git a/assets/models/custom/shapespark_plants/textures/grass-02.png b/assets/models/custom/shapespark_plants/textures/grass-02.png new file mode 100644 index 0000000..662af86 Binary files /dev/null and b/assets/models/custom/shapespark_plants/textures/grass-02.png differ diff --git a/assets/models/custom/shapespark_plants/textures/hedge-01.png b/assets/models/custom/shapespark_plants/textures/hedge-01.png new file mode 100644 index 0000000..9ce3d0f Binary files /dev/null and b/assets/models/custom/shapespark_plants/textures/hedge-01.png differ diff --git a/assets/models/custom/shapespark_plants/textures/hedge-02.png b/assets/models/custom/shapespark_plants/textures/hedge-02.png new file mode 100644 index 0000000..7e668ef Binary files /dev/null and b/assets/models/custom/shapespark_plants/textures/hedge-02.png differ diff --git a/assets/models/custom/shapespark_plants/textures/shrubbery-01.png b/assets/models/custom/shapespark_plants/textures/shrubbery-01.png new file mode 100644 index 0000000..5c17f53 Binary files /dev/null and b/assets/models/custom/shapespark_plants/textures/shrubbery-01.png differ diff --git a/assets/models/custom/shapespark_plants/textures/shrubbery-02.png b/assets/models/custom/shapespark_plants/textures/shrubbery-02.png new file mode 100644 index 0000000..31f1ec2 Binary files /dev/null and b/assets/models/custom/shapespark_plants/textures/shrubbery-02.png differ diff --git a/assets/models/custom/shapespark_plants/textures/shrubbery-1-01.png b/assets/models/custom/shapespark_plants/textures/shrubbery-1-01.png new file mode 100644 index 0000000..3a42ba5 Binary files /dev/null and b/assets/models/custom/shapespark_plants/textures/shrubbery-1-01.png differ diff --git a/assets/models/custom/shapespark_plants/textures/shrubbery-1-02.png b/assets/models/custom/shapespark_plants/textures/shrubbery-1-02.png new file mode 100644 index 0000000..59be45f Binary files /dev/null and b/assets/models/custom/shapespark_plants/textures/shrubbery-1-02.png differ diff --git a/assets/models/custom/shapespark_plants/tree-01-1/model.bin b/assets/models/custom/shapespark_plants/tree-01-1/model.bin new file mode 100644 index 0000000..8015592 Binary files /dev/null and b/assets/models/custom/shapespark_plants/tree-01-1/model.bin differ diff --git a/assets/models/custom/shapespark_plants/tree-01-1/model.gltf b/assets/models/custom/shapespark_plants/tree-01-1/model.gltf new file mode 100644 index 0000000..e7af20f --- /dev/null +++ b/assets/models/custom/shapespark_plants/tree-01-1/model.gltf @@ -0,0 +1,341 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.5.51", + "version":"2.0" + }, + "extensionsUsed":[ + "KHR_materials_specular", + "KHR_materials_ior" + ], + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Tree-01-1.001" + } + ], + "materials":[ + { + "doubleSided":true, + "extensions":{ + "KHR_materials_specular":{ + "specularFactor":0 + }, + "KHR_materials_ior":{ + "ior":1.4500000476837158 + } + }, + "name":"trunk-01", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":0 + }, + "metallicFactor":0, + "roughnessFactor":0.3431818187236786 + } + }, + { + "alphaMode":"BLEND", + "doubleSided":true, + "extensions":{ + "KHR_materials_specular":{ + "specularFactor":0 + }, + "KHR_materials_ior":{ + "ior":1.4500000476837158 + } + }, + "name":"branch-1-01", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "roughnessFactor":0.5 + } + }, + { + "alphaMode":"BLEND", + "doubleSided":true, + "extensions":{ + "KHR_materials_specular":{ + "specularFactor":0 + }, + "KHR_materials_ior":{ + "ior":1.4500000476837158 + } + }, + "name":"branch-1-02", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":2 + }, + "metallicFactor":0, + "roughnessFactor":0.5 + } + } + ], + "meshes":[ + { + "name":"BezierCurve.001", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + }, + { + "attributes":{ + "POSITION":4, + "NORMAL":5, + "TEXCOORD_0":6 + }, + "indices":7, + "material":1 + }, + { + "attributes":{ + "POSITION":8, + "NORMAL":9, + "TEXCOORD_0":10 + }, + "indices":11, + "material":2 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/jpeg", + "name":"bark", + "uri":"../textures/bark.jpg" + }, + { + "mimeType":"image/png", + "name":"branch-01", + "uri":"../textures/branch-01.png" + }, + { + "mimeType":"image/png", + "name":"branch-02", + "uri":"../textures/branch-02.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":164, + "max":[ + 0.8218603134155273, + 6.621478080749512, + 1.1828298568725586 + ], + "min":[ + -0.4366340637207031, + 0, + -0.6610169410705566 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":164, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":164, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":666, + "type":"SCALAR" + }, + { + "bufferView":4, + "componentType":5126, + "count":207, + "max":[ + 2.5295581817626953, + 7.271019458770752, + 3.083549976348877 + ], + "min":[ + -2.5295591354370117, + 1.4613173007965088, + -3.083549737930298 + ], + "type":"VEC3" + }, + { + "bufferView":5, + "componentType":5126, + "count":207, + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":207, + "type":"VEC2" + }, + { + "bufferView":7, + "componentType":5123, + "count":552, + "type":"SCALAR" + }, + { + "bufferView":8, + "componentType":5126, + "count":270, + "max":[ + 2.5027523040771484, + 7.389200210571289, + 2.3003549575805664 + ], + "min":[ + -2.3879647254943848, + 0.7973039150238037, + -2.429833173751831 + ], + "type":"VEC3" + }, + { + "bufferView":9, + "componentType":5126, + "count":270, + "type":"VEC3" + }, + { + "bufferView":10, + "componentType":5126, + "count":270, + "type":"VEC2" + }, + { + "bufferView":11, + "componentType":5123, + "count":720, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":1968, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":1968, + "byteOffset":1968, + "target":34962 + }, + { + "buffer":0, + "byteLength":1312, + "byteOffset":3936, + "target":34962 + }, + { + "buffer":0, + "byteLength":1332, + "byteOffset":5248, + "target":34963 + }, + { + "buffer":0, + "byteLength":2484, + "byteOffset":6580, + "target":34962 + }, + { + "buffer":0, + "byteLength":2484, + "byteOffset":9064, + "target":34962 + }, + { + "buffer":0, + "byteLength":1656, + "byteOffset":11548, + "target":34962 + }, + { + "buffer":0, + "byteLength":1104, + "byteOffset":13204, + "target":34963 + }, + { + "buffer":0, + "byteLength":3240, + "byteOffset":14308, + "target":34962 + }, + { + "buffer":0, + "byteLength":3240, + "byteOffset":17548, + "target":34962 + }, + { + "buffer":0, + "byteLength":2160, + "byteOffset":20788, + "target":34962 + }, + { + "buffer":0, + "byteLength":1440, + "byteOffset":22948, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":24388, + "uri":"model.bin" + } + ] +} diff --git a/assets/models/custom/shapespark_plants/tree-01-1/preview.png b/assets/models/custom/shapespark_plants/tree-01-1/preview.png new file mode 100644 index 0000000..76dc8b8 Binary files /dev/null and b/assets/models/custom/shapespark_plants/tree-01-1/preview.png differ diff --git a/assets/models/custom/shapespark_plants/tree-01-2/model.bin b/assets/models/custom/shapespark_plants/tree-01-2/model.bin new file mode 100644 index 0000000..1996364 Binary files /dev/null and b/assets/models/custom/shapespark_plants/tree-01-2/model.bin differ diff --git a/assets/models/custom/shapespark_plants/tree-01-2/model.gltf b/assets/models/custom/shapespark_plants/tree-01-2/model.gltf new file mode 100644 index 0000000..621aa84 --- /dev/null +++ b/assets/models/custom/shapespark_plants/tree-01-2/model.gltf @@ -0,0 +1,341 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.5.51", + "version":"2.0" + }, + "extensionsUsed":[ + "KHR_materials_specular", + "KHR_materials_ior" + ], + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Tree-01-2.001" + } + ], + "materials":[ + { + "doubleSided":true, + "extensions":{ + "KHR_materials_specular":{ + "specularFactor":0 + }, + "KHR_materials_ior":{ + "ior":1.4500000476837158 + } + }, + "name":"trunk-01", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":0 + }, + "metallicFactor":0, + "roughnessFactor":0.3431818187236786 + } + }, + { + "alphaMode":"BLEND", + "doubleSided":true, + "extensions":{ + "KHR_materials_specular":{ + "specularFactor":0 + }, + "KHR_materials_ior":{ + "ior":1.4500000476837158 + } + }, + "name":"branch-1-01", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "roughnessFactor":0.5 + } + }, + { + "alphaMode":"BLEND", + "doubleSided":true, + "extensions":{ + "KHR_materials_specular":{ + "specularFactor":0 + }, + "KHR_materials_ior":{ + "ior":1.4500000476837158 + } + }, + "name":"branch-1-02", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":2 + }, + "metallicFactor":0, + "roughnessFactor":0.5 + } + } + ], + "meshes":[ + { + "name":"BezierCurve.001", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + }, + { + "attributes":{ + "POSITION":4, + "NORMAL":5, + "TEXCOORD_0":6 + }, + "indices":7, + "material":1 + }, + { + "attributes":{ + "POSITION":8, + "NORMAL":9, + "TEXCOORD_0":10 + }, + "indices":11, + "material":2 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/jpeg", + "name":"bark", + "uri":"../textures/bark.jpg" + }, + { + "mimeType":"image/png", + "name":"branch-01", + "uri":"../textures/branch-01.png" + }, + { + "mimeType":"image/png", + "name":"branch-02", + "uri":"../textures/branch-02.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":164, + "max":[ + 0.45966434478759766, + 6.621478080749512, + 1.0919761657714844 + ], + "min":[ + -0.7988300323486328, + 0, + -0.7518711090087891 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":164, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":164, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":666, + "type":"SCALAR" + }, + { + "bufferView":4, + "componentType":5126, + "count":207, + "max":[ + 3.063852310180664, + 7.500932693481445, + 3.6582088470458984 + ], + "min":[ + -3.2751903533935547, + 1.1391396522521973, + -3.658209800720215 + ], + "type":"VEC3" + }, + { + "bufferView":5, + "componentType":5126, + "count":207, + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":207, + "type":"VEC2" + }, + { + "bufferView":7, + "componentType":5123, + "count":552, + "type":"SCALAR" + }, + { + "bufferView":8, + "componentType":5126, + "count":270, + "max":[ + 3.275191307067871, + 7.38088321685791, + 2.8918838500976562 + ], + "min":[ + -3.127246379852295, + 0.31810951232910156, + -3.5481624603271484 + ], + "type":"VEC3" + }, + { + "bufferView":9, + "componentType":5126, + "count":270, + "type":"VEC3" + }, + { + "bufferView":10, + "componentType":5126, + "count":270, + "type":"VEC2" + }, + { + "bufferView":11, + "componentType":5123, + "count":720, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":1968, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":1968, + "byteOffset":1968, + "target":34962 + }, + { + "buffer":0, + "byteLength":1312, + "byteOffset":3936, + "target":34962 + }, + { + "buffer":0, + "byteLength":1332, + "byteOffset":5248, + "target":34963 + }, + { + "buffer":0, + "byteLength":2484, + "byteOffset":6580, + "target":34962 + }, + { + "buffer":0, + "byteLength":2484, + "byteOffset":9064, + "target":34962 + }, + { + "buffer":0, + "byteLength":1656, + "byteOffset":11548, + "target":34962 + }, + { + "buffer":0, + "byteLength":1104, + "byteOffset":13204, + "target":34963 + }, + { + "buffer":0, + "byteLength":3240, + "byteOffset":14308, + "target":34962 + }, + { + "buffer":0, + "byteLength":3240, + "byteOffset":17548, + "target":34962 + }, + { + "buffer":0, + "byteLength":2160, + "byteOffset":20788, + "target":34962 + }, + { + "buffer":0, + "byteLength":1440, + "byteOffset":22948, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":24388, + "uri":"model.bin" + } + ] +} diff --git a/assets/models/custom/shapespark_plants/tree-01-2/preview.png b/assets/models/custom/shapespark_plants/tree-01-2/preview.png new file mode 100644 index 0000000..0fecd5a Binary files /dev/null and b/assets/models/custom/shapespark_plants/tree-01-2/preview.png differ diff --git a/assets/models/custom/shapespark_plants/tree-01-3/model.bin b/assets/models/custom/shapespark_plants/tree-01-3/model.bin new file mode 100644 index 0000000..1a382d5 Binary files /dev/null and b/assets/models/custom/shapespark_plants/tree-01-3/model.bin differ diff --git a/assets/models/custom/shapespark_plants/tree-01-3/model.gltf b/assets/models/custom/shapespark_plants/tree-01-3/model.gltf new file mode 100644 index 0000000..892a019 --- /dev/null +++ b/assets/models/custom/shapespark_plants/tree-01-3/model.gltf @@ -0,0 +1,341 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.5.51", + "version":"2.0" + }, + "extensionsUsed":[ + "KHR_materials_specular", + "KHR_materials_ior" + ], + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Tree-01-3.001" + } + ], + "materials":[ + { + "doubleSided":true, + "extensions":{ + "KHR_materials_specular":{ + "specularFactor":0 + }, + "KHR_materials_ior":{ + "ior":1.4500000476837158 + } + }, + "name":"trunk-01", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":0 + }, + "metallicFactor":0, + "roughnessFactor":0.3431818187236786 + } + }, + { + "alphaMode":"BLEND", + "doubleSided":true, + "extensions":{ + "KHR_materials_specular":{ + "specularFactor":0 + }, + "KHR_materials_ior":{ + "ior":1.4500000476837158 + } + }, + "name":"branch-1-02", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "roughnessFactor":0.5 + } + }, + { + "alphaMode":"BLEND", + "doubleSided":true, + "extensions":{ + "KHR_materials_specular":{ + "specularFactor":0 + }, + "KHR_materials_ior":{ + "ior":1.4500000476837158 + } + }, + "name":"branch-1-01", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":2 + }, + "metallicFactor":0, + "roughnessFactor":0.5 + } + } + ], + "meshes":[ + { + "name":"BezierCurve.001", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + }, + { + "attributes":{ + "POSITION":4, + "NORMAL":5, + "TEXCOORD_0":6 + }, + "indices":7, + "material":1 + }, + { + "attributes":{ + "POSITION":8, + "NORMAL":9, + "TEXCOORD_0":10 + }, + "indices":11, + "material":2 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/jpeg", + "name":"bark", + "uri":"../textures/bark.jpg" + }, + { + "mimeType":"image/png", + "name":"branch-02", + "uri":"../textures/branch-02.png" + }, + { + "mimeType":"image/png", + "name":"branch-01", + "uri":"../textures/branch-01.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":97, + "max":[ + 0.5463266372680664, + 6.624148368835449, + 1.091501235961914 + ], + "min":[ + -0.2688760757446289, + 0, + -0.03189659118652344 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":97, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":97, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":396, + "type":"SCALAR" + }, + { + "bufferView":4, + "componentType":5126, + "count":180, + "max":[ + 3.6352453231811523, + 7.349333763122559, + 2.694406509399414 + ], + "min":[ + -2.649722099304199, + 0.4657435417175293, + -2.9972362518310547 + ], + "type":"VEC3" + }, + { + "bufferView":5, + "componentType":5126, + "count":180, + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":180, + "type":"VEC2" + }, + { + "bufferView":7, + "componentType":5123, + "count":480, + "type":"SCALAR" + }, + { + "bufferView":8, + "componentType":5126, + "count":135, + "max":[ + 3.3398542404174805, + 7.510513782501221, + 3.1046142578125 + ], + "min":[ + -3.6352462768554688, + 1.229151725769043, + -3.1046133041381836 + ], + "type":"VEC3" + }, + { + "bufferView":9, + "componentType":5126, + "count":135, + "type":"VEC3" + }, + { + "bufferView":10, + "componentType":5126, + "count":135, + "type":"VEC2" + }, + { + "bufferView":11, + "componentType":5123, + "count":360, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":1164, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":1164, + "byteOffset":1164, + "target":34962 + }, + { + "buffer":0, + "byteLength":776, + "byteOffset":2328, + "target":34962 + }, + { + "buffer":0, + "byteLength":792, + "byteOffset":3104, + "target":34963 + }, + { + "buffer":0, + "byteLength":2160, + "byteOffset":3896, + "target":34962 + }, + { + "buffer":0, + "byteLength":2160, + "byteOffset":6056, + "target":34962 + }, + { + "buffer":0, + "byteLength":1440, + "byteOffset":8216, + "target":34962 + }, + { + "buffer":0, + "byteLength":960, + "byteOffset":9656, + "target":34963 + }, + { + "buffer":0, + "byteLength":1620, + "byteOffset":10616, + "target":34962 + }, + { + "buffer":0, + "byteLength":1620, + "byteOffset":12236, + "target":34962 + }, + { + "buffer":0, + "byteLength":1080, + "byteOffset":13856, + "target":34962 + }, + { + "buffer":0, + "byteLength":720, + "byteOffset":14936, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":15656, + "uri":"model.bin" + } + ] +} diff --git a/assets/models/custom/shapespark_plants/tree-01-3/preview.png b/assets/models/custom/shapespark_plants/tree-01-3/preview.png new file mode 100644 index 0000000..a729632 Binary files /dev/null and b/assets/models/custom/shapespark_plants/tree-01-3/preview.png differ diff --git a/assets/models/custom/shapespark_plants/tree-01-4/model.bin b/assets/models/custom/shapespark_plants/tree-01-4/model.bin new file mode 100644 index 0000000..fce8ead Binary files /dev/null and b/assets/models/custom/shapespark_plants/tree-01-4/model.bin differ diff --git a/assets/models/custom/shapespark_plants/tree-01-4/model.gltf b/assets/models/custom/shapespark_plants/tree-01-4/model.gltf new file mode 100644 index 0000000..3e675f0 --- /dev/null +++ b/assets/models/custom/shapespark_plants/tree-01-4/model.gltf @@ -0,0 +1,341 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.5.51", + "version":"2.0" + }, + "extensionsUsed":[ + "KHR_materials_specular", + "KHR_materials_ior" + ], + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Tree-01-4.001" + } + ], + "materials":[ + { + "doubleSided":true, + "extensions":{ + "KHR_materials_specular":{ + "specularFactor":0 + }, + "KHR_materials_ior":{ + "ior":1.4500000476837158 + } + }, + "name":"trunk-01", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":0 + }, + "metallicFactor":0, + "roughnessFactor":0.3431818187236786 + } + }, + { + "alphaMode":"BLEND", + "doubleSided":true, + "extensions":{ + "KHR_materials_specular":{ + "specularFactor":0 + }, + "KHR_materials_ior":{ + "ior":1.4500000476837158 + } + }, + "name":"branch-1-01", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "roughnessFactor":0.5 + } + }, + { + "alphaMode":"BLEND", + "doubleSided":true, + "extensions":{ + "KHR_materials_specular":{ + "specularFactor":0 + }, + "KHR_materials_ior":{ + "ior":1.4500000476837158 + } + }, + "name":"branch-1-02", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":2 + }, + "metallicFactor":0, + "roughnessFactor":0.5 + } + } + ], + "meshes":[ + { + "name":"BezierCurve.001", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + }, + { + "attributes":{ + "POSITION":4, + "NORMAL":5, + "TEXCOORD_0":6 + }, + "indices":7, + "material":1 + }, + { + "attributes":{ + "POSITION":8, + "NORMAL":9, + "TEXCOORD_0":10 + }, + "indices":11, + "material":2 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/jpeg", + "name":"bark", + "uri":"../textures/bark.jpg" + }, + { + "mimeType":"image/png", + "name":"branch-01", + "uri":"../textures/branch-01.png" + }, + { + "mimeType":"image/png", + "name":"branch-02", + "uri":"../textures/branch-02.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":94, + "max":[ + 0.5976400375366211, + 4.776680946350098, + 0.9766197204589844 + ], + "min":[ + -0.21756267547607422, + 0.01782703399658203, + -0.12966156005859375 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":94, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":94, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":360, + "type":"SCALAR" + }, + { + "bufferView":4, + "componentType":5126, + "count":126, + "max":[ + 2.358184814453125, + 5.383872032165527, + 1.9450798034667969 + ], + "min":[ + -2.358184814453125, + 0, + -1.7133827209472656 + ], + "type":"VEC3" + }, + { + "bufferView":5, + "componentType":5126, + "count":126, + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":126, + "type":"VEC2" + }, + { + "bufferView":7, + "componentType":5123, + "count":336, + "type":"SCALAR" + }, + { + "bufferView":8, + "componentType":5126, + "count":153, + "max":[ + 2.3450727462768555, + 5.40532112121582, + 2.0103206634521484 + ], + "min":[ + -1.6531877517700195, + 0.02733469009399414, + -2.0103187561035156 + ], + "type":"VEC3" + }, + { + "bufferView":9, + "componentType":5126, + "count":153, + "type":"VEC3" + }, + { + "bufferView":10, + "componentType":5126, + "count":153, + "type":"VEC2" + }, + { + "bufferView":11, + "componentType":5123, + "count":408, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":1128, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":1128, + "byteOffset":1128, + "target":34962 + }, + { + "buffer":0, + "byteLength":752, + "byteOffset":2256, + "target":34962 + }, + { + "buffer":0, + "byteLength":720, + "byteOffset":3008, + "target":34963 + }, + { + "buffer":0, + "byteLength":1512, + "byteOffset":3728, + "target":34962 + }, + { + "buffer":0, + "byteLength":1512, + "byteOffset":5240, + "target":34962 + }, + { + "buffer":0, + "byteLength":1008, + "byteOffset":6752, + "target":34962 + }, + { + "buffer":0, + "byteLength":672, + "byteOffset":7760, + "target":34963 + }, + { + "buffer":0, + "byteLength":1836, + "byteOffset":8432, + "target":34962 + }, + { + "buffer":0, + "byteLength":1836, + "byteOffset":10268, + "target":34962 + }, + { + "buffer":0, + "byteLength":1224, + "byteOffset":12104, + "target":34962 + }, + { + "buffer":0, + "byteLength":816, + "byteOffset":13328, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":14144, + "uri":"model.bin" + } + ] +} diff --git a/assets/models/custom/shapespark_plants/tree-01-4/preview.png b/assets/models/custom/shapespark_plants/tree-01-4/preview.png new file mode 100644 index 0000000..34dfd9f Binary files /dev/null and b/assets/models/custom/shapespark_plants/tree-01-4/preview.png differ diff --git a/assets/models/custom/shapespark_plants/tree-02-1/model.bin b/assets/models/custom/shapespark_plants/tree-02-1/model.bin new file mode 100644 index 0000000..548be3a Binary files /dev/null and b/assets/models/custom/shapespark_plants/tree-02-1/model.bin differ diff --git a/assets/models/custom/shapespark_plants/tree-02-1/model.gltf b/assets/models/custom/shapespark_plants/tree-02-1/model.gltf new file mode 100644 index 0000000..9760ff9 --- /dev/null +++ b/assets/models/custom/shapespark_plants/tree-02-1/model.gltf @@ -0,0 +1,341 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.5.51", + "version":"2.0" + }, + "extensionsUsed":[ + "KHR_materials_specular", + "KHR_materials_ior" + ], + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Tree-02-1.001" + } + ], + "materials":[ + { + "doubleSided":true, + "extensions":{ + "KHR_materials_specular":{ + "specularFactor":0 + }, + "KHR_materials_ior":{ + "ior":1.4500000476837158 + } + }, + "name":"trunk-01", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":0 + }, + "metallicFactor":0, + "roughnessFactor":0.3431818187236786 + } + }, + { + "alphaMode":"BLEND", + "doubleSided":true, + "extensions":{ + "KHR_materials_specular":{ + "specularFactor":0 + }, + "KHR_materials_ior":{ + "ior":1.4500000476837158 + } + }, + "name":"branch-2-01", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "roughnessFactor":0.5 + } + }, + { + "alphaMode":"BLEND", + "doubleSided":true, + "extensions":{ + "KHR_materials_specular":{ + "specularFactor":0 + }, + "KHR_materials_ior":{ + "ior":1.4500000476837158 + } + }, + "name":"branch-2-02", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":2 + }, + "metallicFactor":0, + "roughnessFactor":0.5 + } + } + ], + "meshes":[ + { + "name":"BezierCurve.001", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + }, + { + "attributes":{ + "POSITION":4, + "NORMAL":5, + "TEXCOORD_0":6 + }, + "indices":7, + "material":1 + }, + { + "attributes":{ + "POSITION":8, + "NORMAL":9, + "TEXCOORD_0":10 + }, + "indices":11, + "material":2 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/jpeg", + "name":"bark", + "uri":"../textures/bark.jpg" + }, + { + "mimeType":"image/png", + "name":"branch-1-01", + "uri":"../textures/branch-1-01.png" + }, + { + "mimeType":"image/png", + "name":"branch-1-02", + "uri":"../textures/branch-1-02.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":164, + "max":[ + 0.5824604034423828, + 6.621478080749512, + 1.0348536968231201 + ], + "min":[ + -1.07073974609375, + 0, + -0.3808627128601074 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":164, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":164, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":666, + "type":"SCALAR" + }, + { + "bufferView":4, + "componentType":5126, + "count":207, + "max":[ + 2.7354812622070312, + 7.271019458770752, + 2.717104434967041 + ], + "min":[ + -2.820368766784668, + 1.460705041885376, + -2.8531787395477295 + ], + "type":"VEC3" + }, + { + "bufferView":5, + "componentType":5126, + "count":207, + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":207, + "type":"VEC2" + }, + { + "bufferView":7, + "componentType":5123, + "count":552, + "type":"SCALAR" + }, + { + "bufferView":8, + "componentType":5126, + "count":270, + "max":[ + 2.8203697204589844, + 7.389200210571289, + 2.8531785011291504 + ], + "min":[ + -2.406785011291504, + 1.0751166343688965, + -2.440432071685791 + ], + "type":"VEC3" + }, + { + "bufferView":9, + "componentType":5126, + "count":270, + "type":"VEC3" + }, + { + "bufferView":10, + "componentType":5126, + "count":270, + "type":"VEC2" + }, + { + "bufferView":11, + "componentType":5123, + "count":720, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":1968, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":1968, + "byteOffset":1968, + "target":34962 + }, + { + "buffer":0, + "byteLength":1312, + "byteOffset":3936, + "target":34962 + }, + { + "buffer":0, + "byteLength":1332, + "byteOffset":5248, + "target":34963 + }, + { + "buffer":0, + "byteLength":2484, + "byteOffset":6580, + "target":34962 + }, + { + "buffer":0, + "byteLength":2484, + "byteOffset":9064, + "target":34962 + }, + { + "buffer":0, + "byteLength":1656, + "byteOffset":11548, + "target":34962 + }, + { + "buffer":0, + "byteLength":1104, + "byteOffset":13204, + "target":34963 + }, + { + "buffer":0, + "byteLength":3240, + "byteOffset":14308, + "target":34962 + }, + { + "buffer":0, + "byteLength":3240, + "byteOffset":17548, + "target":34962 + }, + { + "buffer":0, + "byteLength":2160, + "byteOffset":20788, + "target":34962 + }, + { + "buffer":0, + "byteLength":1440, + "byteOffset":22948, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":24388, + "uri":"model.bin" + } + ] +} diff --git a/assets/models/custom/shapespark_plants/tree-02-1/preview.png b/assets/models/custom/shapespark_plants/tree-02-1/preview.png new file mode 100644 index 0000000..f9b40b3 Binary files /dev/null and b/assets/models/custom/shapespark_plants/tree-02-1/preview.png differ diff --git a/assets/models/custom/shapespark_plants/tree-02-2/model.bin b/assets/models/custom/shapespark_plants/tree-02-2/model.bin new file mode 100644 index 0000000..50e6657 Binary files /dev/null and b/assets/models/custom/shapespark_plants/tree-02-2/model.bin differ diff --git a/assets/models/custom/shapespark_plants/tree-02-2/model.gltf b/assets/models/custom/shapespark_plants/tree-02-2/model.gltf new file mode 100644 index 0000000..d344f9f --- /dev/null +++ b/assets/models/custom/shapespark_plants/tree-02-2/model.gltf @@ -0,0 +1,341 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.5.51", + "version":"2.0" + }, + "extensionsUsed":[ + "KHR_materials_specular", + "KHR_materials_ior" + ], + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Tree-02-2.001" + } + ], + "materials":[ + { + "doubleSided":true, + "extensions":{ + "KHR_materials_specular":{ + "specularFactor":0 + }, + "KHR_materials_ior":{ + "ior":1.4500000476837158 + } + }, + "name":"trunk-01", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":0 + }, + "metallicFactor":0, + "roughnessFactor":0.3431818187236786 + } + }, + { + "alphaMode":"BLEND", + "doubleSided":true, + "extensions":{ + "KHR_materials_specular":{ + "specularFactor":0 + }, + "KHR_materials_ior":{ + "ior":1.4500000476837158 + } + }, + "name":"branch-2-01", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "roughnessFactor":0.5 + } + }, + { + "alphaMode":"BLEND", + "doubleSided":true, + "extensions":{ + "KHR_materials_specular":{ + "specularFactor":0 + }, + "KHR_materials_ior":{ + "ior":1.4500000476837158 + } + }, + "name":"branch-2-02", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":2 + }, + "metallicFactor":0, + "roughnessFactor":0.5 + } + } + ], + "meshes":[ + { + "name":"BezierCurve.001", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + }, + { + "attributes":{ + "POSITION":4, + "NORMAL":5, + "TEXCOORD_0":6 + }, + "indices":7, + "material":1 + }, + { + "attributes":{ + "POSITION":8, + "NORMAL":9, + "TEXCOORD_0":10 + }, + "indices":11, + "material":2 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/jpeg", + "name":"bark", + "uri":"../textures/bark.jpg" + }, + { + "mimeType":"image/png", + "name":"branch-1-01", + "uri":"../textures/branch-1-01.png" + }, + { + "mimeType":"image/png", + "name":"branch-1-02", + "uri":"../textures/branch-1-02.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":164, + "max":[ + 0.9991588592529297, + 6.986281871795654, + 0.6743650436401367 + ], + "min":[ + -0.9445962905883789, + 0, + -0.4201488494873047 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":164, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":164, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":666, + "type":"SCALAR" + }, + { + "bufferView":4, + "componentType":5126, + "count":207, + "max":[ + 2.870983123779297, + 7.98792028427124, + 3.3046512603759766 + ], + "min":[ + -2.7924938201904297, + 1.1536965370178223, + -2.9247303009033203 + ], + "type":"VEC3" + }, + { + "bufferView":5, + "componentType":5126, + "count":207, + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":207, + "type":"VEC2" + }, + { + "bufferView":7, + "componentType":5123, + "count":552, + "type":"SCALAR" + }, + { + "bufferView":8, + "componentType":5126, + "count":270, + "max":[ + 2.2725601196289062, + 7.851191997528076, + 3.170680046081543 + ], + "min":[ + -2.8709850311279297, + 0.5577106475830078, + -3.3046507835388184 + ], + "type":"VEC3" + }, + { + "bufferView":9, + "componentType":5126, + "count":270, + "type":"VEC3" + }, + { + "bufferView":10, + "componentType":5126, + "count":270, + "type":"VEC2" + }, + { + "bufferView":11, + "componentType":5123, + "count":720, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":1968, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":1968, + "byteOffset":1968, + "target":34962 + }, + { + "buffer":0, + "byteLength":1312, + "byteOffset":3936, + "target":34962 + }, + { + "buffer":0, + "byteLength":1332, + "byteOffset":5248, + "target":34963 + }, + { + "buffer":0, + "byteLength":2484, + "byteOffset":6580, + "target":34962 + }, + { + "buffer":0, + "byteLength":2484, + "byteOffset":9064, + "target":34962 + }, + { + "buffer":0, + "byteLength":1656, + "byteOffset":11548, + "target":34962 + }, + { + "buffer":0, + "byteLength":1104, + "byteOffset":13204, + "target":34963 + }, + { + "buffer":0, + "byteLength":3240, + "byteOffset":14308, + "target":34962 + }, + { + "buffer":0, + "byteLength":3240, + "byteOffset":17548, + "target":34962 + }, + { + "buffer":0, + "byteLength":2160, + "byteOffset":20788, + "target":34962 + }, + { + "buffer":0, + "byteLength":1440, + "byteOffset":22948, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":24388, + "uri":"model.bin" + } + ] +} diff --git a/assets/models/custom/shapespark_plants/tree-02-2/preview.png b/assets/models/custom/shapespark_plants/tree-02-2/preview.png new file mode 100644 index 0000000..6638340 Binary files /dev/null and b/assets/models/custom/shapespark_plants/tree-02-2/preview.png differ diff --git a/assets/models/custom/shapespark_plants/tree-02-3/model.bin b/assets/models/custom/shapespark_plants/tree-02-3/model.bin new file mode 100644 index 0000000..28e48f7 Binary files /dev/null and b/assets/models/custom/shapespark_plants/tree-02-3/model.bin differ diff --git a/assets/models/custom/shapespark_plants/tree-02-3/model.gltf b/assets/models/custom/shapespark_plants/tree-02-3/model.gltf new file mode 100644 index 0000000..1f750f0 --- /dev/null +++ b/assets/models/custom/shapespark_plants/tree-02-3/model.gltf @@ -0,0 +1,341 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.5.51", + "version":"2.0" + }, + "extensionsUsed":[ + "KHR_materials_specular", + "KHR_materials_ior" + ], + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Tree-02-3.001" + } + ], + "materials":[ + { + "doubleSided":true, + "extensions":{ + "KHR_materials_specular":{ + "specularFactor":0 + }, + "KHR_materials_ior":{ + "ior":1.4500000476837158 + } + }, + "name":"trunk-01", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":0 + }, + "metallicFactor":0, + "roughnessFactor":0.3431818187236786 + } + }, + { + "alphaMode":"BLEND", + "doubleSided":true, + "extensions":{ + "KHR_materials_specular":{ + "specularFactor":0 + }, + "KHR_materials_ior":{ + "ior":1.4500000476837158 + } + }, + "name":"branch-2-01", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "roughnessFactor":0.5 + } + }, + { + "alphaMode":"BLEND", + "doubleSided":true, + "extensions":{ + "KHR_materials_specular":{ + "specularFactor":0 + }, + "KHR_materials_ior":{ + "ior":1.4500000476837158 + } + }, + "name":"branch-2-02", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":2 + }, + "metallicFactor":0, + "roughnessFactor":0.5 + } + } + ], + "meshes":[ + { + "name":"BezierCurve.001", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + }, + { + "attributes":{ + "POSITION":4, + "NORMAL":5, + "TEXCOORD_0":6 + }, + "indices":7, + "material":1 + }, + { + "attributes":{ + "POSITION":8, + "NORMAL":9, + "TEXCOORD_0":10 + }, + "indices":11, + "material":2 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/jpeg", + "name":"bark", + "uri":"../textures/bark.jpg" + }, + { + "mimeType":"image/png", + "name":"branch-1-01", + "uri":"../textures/branch-1-01.png" + }, + { + "mimeType":"image/png", + "name":"branch-1-02", + "uri":"../textures/branch-1-02.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":97, + "max":[ + 0.5173158645629883, + 6.1467390060424805, + -0.08306694030761719 + ], + "min":[ + -0.4734525680541992, + 0, + -1.1357250213623047 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":97, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":97, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":396, + "type":"SCALAR" + }, + { + "bufferView":4, + "componentType":5126, + "count":135, + "max":[ + 2.7522668838500977, + 6.852516174316406, + 2.634103775024414 + ], + "min":[ + -2.786534309387207, + 1.1823866367340088, + -2.2067394256591797 + ], + "type":"VEC3" + }, + { + "bufferView":5, + "componentType":5126, + "count":135, + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":135, + "type":"VEC2" + }, + { + "bufferView":7, + "componentType":5123, + "count":360, + "type":"SCALAR" + }, + { + "bufferView":8, + "componentType":5126, + "count":180, + "max":[ + 2.786534309387207, + 6.761970520019531, + 2.4235095977783203 + ], + "min":[ + -2.681245803833008, + 0.4321749210357666, + -2.634103775024414 + ], + "type":"VEC3" + }, + { + "bufferView":9, + "componentType":5126, + "count":180, + "type":"VEC3" + }, + { + "bufferView":10, + "componentType":5126, + "count":180, + "type":"VEC2" + }, + { + "bufferView":11, + "componentType":5123, + "count":480, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":1164, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":1164, + "byteOffset":1164, + "target":34962 + }, + { + "buffer":0, + "byteLength":776, + "byteOffset":2328, + "target":34962 + }, + { + "buffer":0, + "byteLength":792, + "byteOffset":3104, + "target":34963 + }, + { + "buffer":0, + "byteLength":1620, + "byteOffset":3896, + "target":34962 + }, + { + "buffer":0, + "byteLength":1620, + "byteOffset":5516, + "target":34962 + }, + { + "buffer":0, + "byteLength":1080, + "byteOffset":7136, + "target":34962 + }, + { + "buffer":0, + "byteLength":720, + "byteOffset":8216, + "target":34963 + }, + { + "buffer":0, + "byteLength":2160, + "byteOffset":8936, + "target":34962 + }, + { + "buffer":0, + "byteLength":2160, + "byteOffset":11096, + "target":34962 + }, + { + "buffer":0, + "byteLength":1440, + "byteOffset":13256, + "target":34962 + }, + { + "buffer":0, + "byteLength":960, + "byteOffset":14696, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":15656, + "uri":"model.bin" + } + ] +} diff --git a/assets/models/custom/shapespark_plants/tree-02-3/preview.png b/assets/models/custom/shapespark_plants/tree-02-3/preview.png new file mode 100644 index 0000000..d9a17f2 Binary files /dev/null and b/assets/models/custom/shapespark_plants/tree-02-3/preview.png differ diff --git a/assets/models/custom/shapespark_plants/tree-02-4/model.bin b/assets/models/custom/shapespark_plants/tree-02-4/model.bin new file mode 100644 index 0000000..0afffbd Binary files /dev/null and b/assets/models/custom/shapespark_plants/tree-02-4/model.bin differ diff --git a/assets/models/custom/shapespark_plants/tree-02-4/model.gltf b/assets/models/custom/shapespark_plants/tree-02-4/model.gltf new file mode 100644 index 0000000..2dab78e --- /dev/null +++ b/assets/models/custom/shapespark_plants/tree-02-4/model.gltf @@ -0,0 +1,341 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.5.51", + "version":"2.0" + }, + "extensionsUsed":[ + "KHR_materials_specular", + "KHR_materials_ior" + ], + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Tree-02-4.001" + } + ], + "materials":[ + { + "doubleSided":true, + "extensions":{ + "KHR_materials_specular":{ + "specularFactor":0 + }, + "KHR_materials_ior":{ + "ior":1.4500000476837158 + } + }, + "name":"trunk-01", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":0 + }, + "metallicFactor":0, + "roughnessFactor":0.3431818187236786 + } + }, + { + "alphaMode":"BLEND", + "doubleSided":true, + "extensions":{ + "KHR_materials_specular":{ + "specularFactor":0 + }, + "KHR_materials_ior":{ + "ior":1.4500000476837158 + } + }, + "name":"branch-2-01", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "roughnessFactor":0.5 + } + }, + { + "alphaMode":"BLEND", + "doubleSided":true, + "extensions":{ + "KHR_materials_specular":{ + "specularFactor":0 + }, + "KHR_materials_ior":{ + "ior":1.4500000476837158 + } + }, + "name":"branch-2-02", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":2 + }, + "metallicFactor":0, + "roughnessFactor":0.5 + } + } + ], + "meshes":[ + { + "name":"BezierCurve.001", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + }, + { + "attributes":{ + "POSITION":4, + "NORMAL":5, + "TEXCOORD_0":6 + }, + "indices":7, + "material":1 + }, + { + "attributes":{ + "POSITION":8, + "NORMAL":9, + "TEXCOORD_0":10 + }, + "indices":11, + "material":2 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/jpeg", + "name":"bark", + "uri":"../textures/bark.jpg" + }, + { + "mimeType":"image/png", + "name":"branch-1-01", + "uri":"../textures/branch-1-01.png" + }, + { + "mimeType":"image/png", + "name":"branch-1-02", + "uri":"../textures/branch-1-02.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":94, + "max":[ + 0.7004184722900391, + 4.742644309997559, + 0.5552902221679688 + ], + "min":[ + -0.14350605010986328, + 0.09638667106628418, + -0.4755744934082031 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":94, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":94, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":360, + "type":"SCALAR" + }, + { + "bufferView":4, + "componentType":5126, + "count":126, + "max":[ + 1.9202880859375, + 5.486015796661377, + 2.198854446411133 + ], + "min":[ + -1.9202890396118164, + 0, + -2.1988525390625 + ], + "type":"VEC3" + }, + { + "bufferView":5, + "componentType":5126, + "count":126, + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":126, + "type":"VEC2" + }, + { + "bufferView":7, + "componentType":5123, + "count":336, + "type":"SCALAR" + }, + { + "bufferView":8, + "componentType":5126, + "count":162, + "max":[ + 1.78387451171875, + 5.444276332855225, + 2.042713165283203 + ], + "min":[ + -1.4893627166748047, + 0.04679131507873535, + -2.1686763763427734 + ], + "type":"VEC3" + }, + { + "bufferView":9, + "componentType":5126, + "count":162, + "type":"VEC3" + }, + { + "bufferView":10, + "componentType":5126, + "count":162, + "type":"VEC2" + }, + { + "bufferView":11, + "componentType":5123, + "count":432, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":1128, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":1128, + "byteOffset":1128, + "target":34962 + }, + { + "buffer":0, + "byteLength":752, + "byteOffset":2256, + "target":34962 + }, + { + "buffer":0, + "byteLength":720, + "byteOffset":3008, + "target":34963 + }, + { + "buffer":0, + "byteLength":1512, + "byteOffset":3728, + "target":34962 + }, + { + "buffer":0, + "byteLength":1512, + "byteOffset":5240, + "target":34962 + }, + { + "buffer":0, + "byteLength":1008, + "byteOffset":6752, + "target":34962 + }, + { + "buffer":0, + "byteLength":672, + "byteOffset":7760, + "target":34963 + }, + { + "buffer":0, + "byteLength":1944, + "byteOffset":8432, + "target":34962 + }, + { + "buffer":0, + "byteLength":1944, + "byteOffset":10376, + "target":34962 + }, + { + "buffer":0, + "byteLength":1296, + "byteOffset":12320, + "target":34962 + }, + { + "buffer":0, + "byteLength":864, + "byteOffset":13616, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":14480, + "uri":"model.bin" + } + ] +} diff --git a/assets/models/custom/shapespark_plants/tree-02-4/preview.png b/assets/models/custom/shapespark_plants/tree-02-4/preview.png new file mode 100644 index 0000000..99a64e8 Binary files /dev/null and b/assets/models/custom/shapespark_plants/tree-02-4/preview.png differ diff --git a/assets/models/custom/shapespark_plants/tree-03-1/model.bin b/assets/models/custom/shapespark_plants/tree-03-1/model.bin new file mode 100644 index 0000000..49296b9 Binary files /dev/null and b/assets/models/custom/shapespark_plants/tree-03-1/model.bin differ diff --git a/assets/models/custom/shapespark_plants/tree-03-1/model.gltf b/assets/models/custom/shapespark_plants/tree-03-1/model.gltf new file mode 100644 index 0000000..c451829 --- /dev/null +++ b/assets/models/custom/shapespark_plants/tree-03-1/model.gltf @@ -0,0 +1,341 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.5.51", + "version":"2.0" + }, + "extensionsUsed":[ + "KHR_materials_specular", + "KHR_materials_ior" + ], + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Tree-03-1.001" + } + ], + "materials":[ + { + "doubleSided":true, + "extensions":{ + "KHR_materials_specular":{ + "specularFactor":0 + }, + "KHR_materials_ior":{ + "ior":1.4500000476837158 + } + }, + "name":"trunk-01", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":0 + }, + "metallicFactor":0, + "roughnessFactor":0.3431818187236786 + } + }, + { + "alphaMode":"BLEND", + "doubleSided":true, + "extensions":{ + "KHR_materials_specular":{ + "specularFactor":0 + }, + "KHR_materials_ior":{ + "ior":1.4500000476837158 + } + }, + "name":"branch-01", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "roughnessFactor":0.5 + } + }, + { + "alphaMode":"BLEND", + "doubleSided":true, + "extensions":{ + "KHR_materials_specular":{ + "specularFactor":0 + }, + "KHR_materials_ior":{ + "ior":1.4500000476837158 + } + }, + "name":"branch-02", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":2 + }, + "metallicFactor":0, + "roughnessFactor":0.5 + } + } + ], + "meshes":[ + { + "name":"BezierCurve.001", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + }, + { + "attributes":{ + "POSITION":4, + "NORMAL":5, + "TEXCOORD_0":6 + }, + "indices":7, + "material":1 + }, + { + "attributes":{ + "POSITION":8, + "NORMAL":9, + "TEXCOORD_0":10 + }, + "indices":11, + "material":2 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/jpeg", + "name":"bark", + "uri":"../textures/bark.jpg" + }, + { + "mimeType":"image/png", + "name":"branch-2-01", + "uri":"../textures/branch-2-01.png" + }, + { + "mimeType":"image/png", + "name":"branch-2-02", + "uri":"../textures/branch-2-02.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":164, + "max":[ + 0.5859603881835938, + 7.866107940673828, + 0.8741261959075928 + ], + "min":[ + -0.9371986389160156, + 0, + -0.8039140701293945 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":164, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":164, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":666, + "type":"SCALAR" + }, + { + "bufferView":4, + "componentType":5126, + "count":207, + "max":[ + 2.5898189544677734, + 8.63774299621582, + 2.2109644412994385 + ], + "min":[ + -2.9977474212646484, + 0.8532743453979492, + -2.854957103729248 + ], + "type":"VEC3" + }, + { + "bufferView":5, + "componentType":5126, + "count":207, + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":207, + "type":"VEC2" + }, + { + "bufferView":7, + "componentType":5123, + "count":552, + "type":"SCALAR" + }, + { + "bufferView":8, + "componentType":5126, + "count":270, + "max":[ + 2.9977455139160156, + 8.77813720703125, + 2.86659836769104 + ], + "min":[ + -2.305652618408203, + 1.1863832473754883, + -2.86659836769104 + ], + "type":"VEC3" + }, + { + "bufferView":9, + "componentType":5126, + "count":270, + "type":"VEC3" + }, + { + "bufferView":10, + "componentType":5126, + "count":270, + "type":"VEC2" + }, + { + "bufferView":11, + "componentType":5123, + "count":720, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":1968, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":1968, + "byteOffset":1968, + "target":34962 + }, + { + "buffer":0, + "byteLength":1312, + "byteOffset":3936, + "target":34962 + }, + { + "buffer":0, + "byteLength":1332, + "byteOffset":5248, + "target":34963 + }, + { + "buffer":0, + "byteLength":2484, + "byteOffset":6580, + "target":34962 + }, + { + "buffer":0, + "byteLength":2484, + "byteOffset":9064, + "target":34962 + }, + { + "buffer":0, + "byteLength":1656, + "byteOffset":11548, + "target":34962 + }, + { + "buffer":0, + "byteLength":1104, + "byteOffset":13204, + "target":34963 + }, + { + "buffer":0, + "byteLength":3240, + "byteOffset":14308, + "target":34962 + }, + { + "buffer":0, + "byteLength":3240, + "byteOffset":17548, + "target":34962 + }, + { + "buffer":0, + "byteLength":2160, + "byteOffset":20788, + "target":34962 + }, + { + "buffer":0, + "byteLength":1440, + "byteOffset":22948, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":24388, + "uri":"model.bin" + } + ] +} diff --git a/assets/models/custom/shapespark_plants/tree-03-1/preview.png b/assets/models/custom/shapespark_plants/tree-03-1/preview.png new file mode 100644 index 0000000..3138a1a Binary files /dev/null and b/assets/models/custom/shapespark_plants/tree-03-1/preview.png differ diff --git a/assets/models/custom/shapespark_plants/tree-03-2/model.bin b/assets/models/custom/shapespark_plants/tree-03-2/model.bin new file mode 100644 index 0000000..8c812eb Binary files /dev/null and b/assets/models/custom/shapespark_plants/tree-03-2/model.bin differ diff --git a/assets/models/custom/shapespark_plants/tree-03-2/model.gltf b/assets/models/custom/shapespark_plants/tree-03-2/model.gltf new file mode 100644 index 0000000..04df589 --- /dev/null +++ b/assets/models/custom/shapespark_plants/tree-03-2/model.gltf @@ -0,0 +1,341 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.5.51", + "version":"2.0" + }, + "extensionsUsed":[ + "KHR_materials_specular", + "KHR_materials_ior" + ], + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Tree-03-2.001" + } + ], + "materials":[ + { + "doubleSided":true, + "extensions":{ + "KHR_materials_specular":{ + "specularFactor":0 + }, + "KHR_materials_ior":{ + "ior":1.4500000476837158 + } + }, + "name":"trunk-01", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":0 + }, + "metallicFactor":0, + "roughnessFactor":0.3431818187236786 + } + }, + { + "alphaMode":"BLEND", + "doubleSided":true, + "extensions":{ + "KHR_materials_specular":{ + "specularFactor":0 + }, + "KHR_materials_ior":{ + "ior":1.4500000476837158 + } + }, + "name":"branch-01", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "roughnessFactor":0.5 + } + }, + { + "alphaMode":"BLEND", + "doubleSided":true, + "extensions":{ + "KHR_materials_specular":{ + "specularFactor":0 + }, + "KHR_materials_ior":{ + "ior":1.4500000476837158 + } + }, + "name":"branch-02", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":2 + }, + "metallicFactor":0, + "roughnessFactor":0.5 + } + } + ], + "meshes":[ + { + "name":"BezierCurve.001", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + }, + { + "attributes":{ + "POSITION":4, + "NORMAL":5, + "TEXCOORD_0":6 + }, + "indices":7, + "material":1 + }, + { + "attributes":{ + "POSITION":8, + "NORMAL":9, + "TEXCOORD_0":10 + }, + "indices":11, + "material":2 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/jpeg", + "name":"bark", + "uri":"../textures/bark.jpg" + }, + { + "mimeType":"image/png", + "name":"branch-2-01", + "uri":"../textures/branch-2-01.png" + }, + { + "mimeType":"image/png", + "name":"branch-2-02", + "uri":"../textures/branch-2-02.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":164, + "max":[ + 0.6920967102050781, + 7.666217803955078, + 0.3003721237182617 + ], + "min":[ + -1.4153861999511719, + 0, + -1.1848573684692383 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":164, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":164, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":666, + "type":"SCALAR" + }, + { + "bufferView":4, + "componentType":5126, + "count":207, + "max":[ + 3.0509891510009766, + 8.684433937072754, + 2.9388837814331055 + ], + "min":[ + -3.295541763305664, + 1.5080325603485107, + -3.3139209747314453 + ], + "type":"VEC3" + }, + { + "bufferView":5, + "componentType":5126, + "count":207, + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":207, + "type":"VEC2" + }, + { + "bufferView":7, + "componentType":5123, + "count":552, + "type":"SCALAR" + }, + { + "bufferView":8, + "componentType":5126, + "count":270, + "max":[ + 3.295541763305664, + 8.545442581176758, + 3.3139209747314453 + ], + "min":[ + -3.0391483306884766, + 1.1312527656555176, + -3.2804408073425293 + ], + "type":"VEC3" + }, + { + "bufferView":9, + "componentType":5126, + "count":270, + "type":"VEC3" + }, + { + "bufferView":10, + "componentType":5126, + "count":270, + "type":"VEC2" + }, + { + "bufferView":11, + "componentType":5123, + "count":720, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":1968, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":1968, + "byteOffset":1968, + "target":34962 + }, + { + "buffer":0, + "byteLength":1312, + "byteOffset":3936, + "target":34962 + }, + { + "buffer":0, + "byteLength":1332, + "byteOffset":5248, + "target":34963 + }, + { + "buffer":0, + "byteLength":2484, + "byteOffset":6580, + "target":34962 + }, + { + "buffer":0, + "byteLength":2484, + "byteOffset":9064, + "target":34962 + }, + { + "buffer":0, + "byteLength":1656, + "byteOffset":11548, + "target":34962 + }, + { + "buffer":0, + "byteLength":1104, + "byteOffset":13204, + "target":34963 + }, + { + "buffer":0, + "byteLength":3240, + "byteOffset":14308, + "target":34962 + }, + { + "buffer":0, + "byteLength":3240, + "byteOffset":17548, + "target":34962 + }, + { + "buffer":0, + "byteLength":2160, + "byteOffset":20788, + "target":34962 + }, + { + "buffer":0, + "byteLength":1440, + "byteOffset":22948, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":24388, + "uri":"model.bin" + } + ] +} diff --git a/assets/models/custom/shapespark_plants/tree-03-2/preview.png b/assets/models/custom/shapespark_plants/tree-03-2/preview.png new file mode 100644 index 0000000..9b60d33 Binary files /dev/null and b/assets/models/custom/shapespark_plants/tree-03-2/preview.png differ diff --git a/assets/models/custom/shapespark_plants/tree-03-3/model.bin b/assets/models/custom/shapespark_plants/tree-03-3/model.bin new file mode 100644 index 0000000..c12b8a0 Binary files /dev/null and b/assets/models/custom/shapespark_plants/tree-03-3/model.bin differ diff --git a/assets/models/custom/shapespark_plants/tree-03-3/model.gltf b/assets/models/custom/shapespark_plants/tree-03-3/model.gltf new file mode 100644 index 0000000..56893dc --- /dev/null +++ b/assets/models/custom/shapespark_plants/tree-03-3/model.gltf @@ -0,0 +1,341 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.5.51", + "version":"2.0" + }, + "extensionsUsed":[ + "KHR_materials_specular", + "KHR_materials_ior" + ], + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Tree-03-3.001" + } + ], + "materials":[ + { + "doubleSided":true, + "extensions":{ + "KHR_materials_specular":{ + "specularFactor":0 + }, + "KHR_materials_ior":{ + "ior":1.4500000476837158 + } + }, + "name":"trunk-01", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":0 + }, + "metallicFactor":0, + "roughnessFactor":0.3431818187236786 + } + }, + { + "alphaMode":"BLEND", + "doubleSided":true, + "extensions":{ + "KHR_materials_specular":{ + "specularFactor":0 + }, + "KHR_materials_ior":{ + "ior":1.4500000476837158 + } + }, + "name":"branch-01", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "roughnessFactor":0.5 + } + }, + { + "alphaMode":"BLEND", + "doubleSided":true, + "extensions":{ + "KHR_materials_specular":{ + "specularFactor":0 + }, + "KHR_materials_ior":{ + "ior":1.4500000476837158 + } + }, + "name":"branch-02", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":2 + }, + "metallicFactor":0, + "roughnessFactor":0.5 + } + } + ], + "meshes":[ + { + "name":"BezierCurve.001", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + }, + { + "attributes":{ + "POSITION":4, + "NORMAL":5, + "TEXCOORD_0":6 + }, + "indices":7, + "material":1 + }, + { + "attributes":{ + "POSITION":8, + "NORMAL":9, + "TEXCOORD_0":10 + }, + "indices":11, + "material":2 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/jpeg", + "name":"bark", + "uri":"../textures/bark.jpg" + }, + { + "mimeType":"image/png", + "name":"branch-2-01", + "uri":"../textures/branch-2-01.png" + }, + { + "mimeType":"image/png", + "name":"branch-2-02", + "uri":"../textures/branch-2-02.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":97, + "max":[ + 0.2279338836669922, + 6.8598809242248535, + 0.8420810699462891 + ], + "min":[ + -0.5072898864746094, + 0.3555111885070801, + -0.5547981262207031 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":97, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":97, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":396, + "type":"SCALAR" + }, + { + "bufferView":4, + "componentType":5126, + "count":135, + "max":[ + 3.3329429626464844, + 7.606721878051758, + 2.678312301635742 + ], + "min":[ + -1.9925193786621094, + 1.359745979309082, + -2.8415660858154297 + ], + "type":"VEC3" + }, + { + "bufferView":5, + "componentType":5126, + "count":135, + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":135, + "type":"VEC2" + }, + { + "bufferView":7, + "componentType":5123, + "count":360, + "type":"SCALAR" + }, + { + "bufferView":8, + "componentType":5126, + "count":180, + "max":[ + 2.7369384765625, + 7.510908126831055, + 2.8415660858154297 + ], + "min":[ + -3.3329410552978516, + 0, + -2.3149185180664062 + ], + "type":"VEC3" + }, + { + "bufferView":9, + "componentType":5126, + "count":180, + "type":"VEC3" + }, + { + "bufferView":10, + "componentType":5126, + "count":180, + "type":"VEC2" + }, + { + "bufferView":11, + "componentType":5123, + "count":480, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":1164, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":1164, + "byteOffset":1164, + "target":34962 + }, + { + "buffer":0, + "byteLength":776, + "byteOffset":2328, + "target":34962 + }, + { + "buffer":0, + "byteLength":792, + "byteOffset":3104, + "target":34963 + }, + { + "buffer":0, + "byteLength":1620, + "byteOffset":3896, + "target":34962 + }, + { + "buffer":0, + "byteLength":1620, + "byteOffset":5516, + "target":34962 + }, + { + "buffer":0, + "byteLength":1080, + "byteOffset":7136, + "target":34962 + }, + { + "buffer":0, + "byteLength":720, + "byteOffset":8216, + "target":34963 + }, + { + "buffer":0, + "byteLength":2160, + "byteOffset":8936, + "target":34962 + }, + { + "buffer":0, + "byteLength":2160, + "byteOffset":11096, + "target":34962 + }, + { + "buffer":0, + "byteLength":1440, + "byteOffset":13256, + "target":34962 + }, + { + "buffer":0, + "byteLength":960, + "byteOffset":14696, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":15656, + "uri":"model.bin" + } + ] +} diff --git a/assets/models/custom/shapespark_plants/tree-03-3/preview.png b/assets/models/custom/shapespark_plants/tree-03-3/preview.png new file mode 100644 index 0000000..a08ba40 Binary files /dev/null and b/assets/models/custom/shapespark_plants/tree-03-3/preview.png differ diff --git a/assets/models/custom/shapespark_plants/tree-03-4/model.bin b/assets/models/custom/shapespark_plants/tree-03-4/model.bin new file mode 100644 index 0000000..f1bdb42 Binary files /dev/null and b/assets/models/custom/shapespark_plants/tree-03-4/model.bin differ diff --git a/assets/models/custom/shapespark_plants/tree-03-4/model.gltf b/assets/models/custom/shapespark_plants/tree-03-4/model.gltf new file mode 100644 index 0000000..e5fad28 --- /dev/null +++ b/assets/models/custom/shapespark_plants/tree-03-4/model.gltf @@ -0,0 +1,341 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.5.51", + "version":"2.0" + }, + "extensionsUsed":[ + "KHR_materials_specular", + "KHR_materials_ior" + ], + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Tree-03-4.001" + } + ], + "materials":[ + { + "doubleSided":true, + "extensions":{ + "KHR_materials_specular":{ + "specularFactor":0 + }, + "KHR_materials_ior":{ + "ior":1.4500000476837158 + } + }, + "name":"trunk-01", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":0 + }, + "metallicFactor":0, + "roughnessFactor":0.3431818187236786 + } + }, + { + "alphaMode":"BLEND", + "doubleSided":true, + "extensions":{ + "KHR_materials_specular":{ + "specularFactor":0 + }, + "KHR_materials_ior":{ + "ior":1.4500000476837158 + } + }, + "name":"branch-01", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "roughnessFactor":0.5 + } + }, + { + "alphaMode":"BLEND", + "doubleSided":true, + "extensions":{ + "KHR_materials_specular":{ + "specularFactor":0 + }, + "KHR_materials_ior":{ + "ior":1.4500000476837158 + } + }, + "name":"branch-02", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":2 + }, + "metallicFactor":0, + "roughnessFactor":0.5 + } + } + ], + "meshes":[ + { + "name":"BezierCurve.001", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + }, + { + "attributes":{ + "POSITION":4, + "NORMAL":5, + "TEXCOORD_0":6 + }, + "indices":7, + "material":1 + }, + { + "attributes":{ + "POSITION":8, + "NORMAL":9, + "TEXCOORD_0":10 + }, + "indices":11, + "material":2 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/jpeg", + "name":"bark", + "uri":"../textures/bark.jpg" + }, + { + "mimeType":"image/png", + "name":"branch-2-01", + "uri":"../textures/branch-2-01.png" + }, + { + "mimeType":"image/png", + "name":"branch-2-02", + "uri":"../textures/branch-2-02.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":94, + "max":[ + 0.5530891418457031, + 5.535346031188965, + 0.8070354461669922 + ], + "min":[ + -0.6760139465332031, + 0.058461666107177734, + -0.12025260925292969 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":94, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":94, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":360, + "type":"SCALAR" + }, + { + "bufferView":4, + "componentType":5126, + "count":126, + "max":[ + 2.293233871459961, + 6.411612510681152, + 2.182567596435547 + ], + "min":[ + -2.293231964111328, + 0.17456316947937012, + -2.182567596435547 + ], + "type":"VEC3" + }, + { + "bufferView":5, + "componentType":5126, + "count":126, + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":126, + "type":"VEC2" + }, + { + "bufferView":7, + "componentType":5123, + "count":336, + "type":"SCALAR" + }, + { + "bufferView":8, + "componentType":5126, + "count":162, + "max":[ + 2.089954376220703, + 6.362410545349121, + 2.1161270141601562 + ], + "min":[ + -2.218189239501953, + 0, + -1.580718994140625 + ], + "type":"VEC3" + }, + { + "bufferView":9, + "componentType":5126, + "count":162, + "type":"VEC3" + }, + { + "bufferView":10, + "componentType":5126, + "count":162, + "type":"VEC2" + }, + { + "bufferView":11, + "componentType":5123, + "count":432, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":1128, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":1128, + "byteOffset":1128, + "target":34962 + }, + { + "buffer":0, + "byteLength":752, + "byteOffset":2256, + "target":34962 + }, + { + "buffer":0, + "byteLength":720, + "byteOffset":3008, + "target":34963 + }, + { + "buffer":0, + "byteLength":1512, + "byteOffset":3728, + "target":34962 + }, + { + "buffer":0, + "byteLength":1512, + "byteOffset":5240, + "target":34962 + }, + { + "buffer":0, + "byteLength":1008, + "byteOffset":6752, + "target":34962 + }, + { + "buffer":0, + "byteLength":672, + "byteOffset":7760, + "target":34963 + }, + { + "buffer":0, + "byteLength":1944, + "byteOffset":8432, + "target":34962 + }, + { + "buffer":0, + "byteLength":1944, + "byteOffset":10376, + "target":34962 + }, + { + "buffer":0, + "byteLength":1296, + "byteOffset":12320, + "target":34962 + }, + { + "buffer":0, + "byteLength":864, + "byteOffset":13616, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":14480, + "uri":"model.bin" + } + ] +} diff --git a/assets/models/custom/shapespark_plants/tree-03-4/preview.png b/assets/models/custom/shapespark_plants/tree-03-4/preview.png new file mode 100644 index 0000000..66b562d Binary files /dev/null and b/assets/models/custom/shapespark_plants/tree-03-4/preview.png differ diff --git a/assets/models/polyhaven/shrub_02/shrub_02.bin b/assets/models/polyhaven/shrub_02/shrub_02.bin deleted file mode 100644 index 428a3b5..0000000 Binary files a/assets/models/polyhaven/shrub_02/shrub_02.bin and /dev/null differ diff --git a/assets/models/polyhaven/shrub_02/shrub_02_1k.gltf b/assets/models/polyhaven/shrub_02/shrub_02_1k.gltf deleted file mode 100644 index 8e58e2e..0000000 --- a/assets/models/polyhaven/shrub_02/shrub_02_1k.gltf +++ /dev/null @@ -1,437 +0,0 @@ -{ - "asset": { - "generator": "Khronos glTF Blender I/O v3.5.30", - "version": "2.0" - }, - "scene": 0, - "scenes": [ - { - "name": "Scene", - "nodes": [ - 0, - 1, - 2, - 3 - ] - } - ], - "nodes": [ - { - "mesh": 0, - "name": "shrub_02_a", - "rotation": [ - 0.12589912116527557, - -0.6947680711746216, - 0.006097283214330673, - 0.708102822303772 - ], - "translation": [ - -1.5478131771087646, - -0.005240630358457565, - -0.02073405683040619 - ] - }, - { - "mesh": 1, - "name": "shrub_02_b", - "rotation": [ - 0.08358937501907349, - -0.746630847454071, - 0.26227879524230957, - 0.6056113243103027 - ], - "translation": [ - 0.0007123738760128617, - -0.006340932101011276, - -0.01680799387395382 - ] - }, - { - "mesh": 2, - "name": "shrub_02_c", - "rotation": [ - 0.12648986279964447, - -0.7129753232002258, - 0.3943961560726166, - 0.5657898783683777 - ], - "translation": [ - 1.5559492111206055, - -0.005484403111040592, - -0.006101916544139385 - ] - }, - { - "mesh": 3, - "name": "shrub_02_d", - "rotation": [ - 0.047377295792102814, - -0.7383221983909607, - -0.300414502620697, - 0.60198575258255 - ], - "translation": [ - 3.258664131164551, - -0.004767145495861769, - -0.005447957664728165 - ] - } - ], - "materials": [ - { - "alphaCutoff": 0.5, - "alphaMode": "MASK", - "doubleSided": true, - "name": "shrub_02", - "normalTexture": { - "index": 0 - }, - "pbrMetallicRoughness": { - "baseColorTexture": { - "index": 1 - }, - "metallicFactor": 0, - "metallicRoughnessTexture": { - "index": 2 - } - } - } - ], - "meshes": [ - { - "name": "Plane.024", - "primitives": [ - { - "attributes": { - "POSITION": 0, - "TEXCOORD_0": 1, - "NORMAL": 2 - }, - "indices": 3, - "material": 0 - } - ] - }, - { - "name": "Plane.029", - "primitives": [ - { - "attributes": { - "POSITION": 4, - "TEXCOORD_0": 5, - "NORMAL": 6 - }, - "indices": 7, - "material": 0 - } - ] - }, - { - "name": "Plane.041", - "primitives": [ - { - "attributes": { - "POSITION": 8, - "TEXCOORD_0": 9, - "NORMAL": 10 - }, - "indices": 11, - "material": 0 - } - ] - }, - { - "name": "Plane.036", - "primitives": [ - { - "attributes": { - "POSITION": 12, - "TEXCOORD_0": 13, - "NORMAL": 14 - }, - "indices": 15, - "material": 0 - } - ] - } - ], - "textures": [ - { - "sampler": 0, - "source": 0 - }, - { - "sampler": 0, - "source": 1 - }, - { - "sampler": 0, - "source": 2 - } - ], - "images": [ - { - "mimeType": "image/jpeg", - "name": "shrub_02_nor_gl", - "uri": "textures/shrub_02_nor_gl_1k.jpg" - }, - { - "mimeType": "image/jpeg", - "name": "shrub_02_diff", - "uri": "textures/shrub_02_diff_1k.jpg" - }, - { - "mimeType": "image/jpeg", - "name": "shrub_02_rough", - "uri": "textures/shrub_02_arm_1k.jpg" - } - ], - "accessors": [ - { - "bufferView": 0, - "componentType": 5126, - "count": 5125, - "max": [ - 0.6156559586524963, - 1.6821810007095337, - 0.42684367299079895 - ], - "min": [ - -0.9439988136291504, - -0.03012576885521412, - -0.863244354724884 - ], - "type": "VEC3" - }, - { - "bufferView": 1, - "componentType": 5126, - "count": 5125, - "type": "VEC2" - }, - { - "bufferView": 2, - "componentType": 5126, - "count": 5125, - "type": "VEC3" - }, - { - "bufferView": 3, - "componentType": 5123, - "count": 22770, - "type": "SCALAR" - }, - { - "bufferView": 4, - "componentType": 5126, - "count": 3600, - "max": [ - 0.9647624492645264, - 1.0844767093658447, - 0.30848613381385803 - ], - "min": [ - -0.4038015305995941, - -0.10226154327392578, - -1.0773800611495972 - ], - "type": "VEC3" - }, - { - "bufferView": 5, - "componentType": 5126, - "count": 3600, - "type": "VEC2" - }, - { - "bufferView": 6, - "componentType": 5126, - "count": 3600, - "type": "VEC3" - }, - { - "bufferView": 7, - "componentType": 5123, - "count": 15726, - "type": "SCALAR" - }, - { - "bufferView": 8, - "componentType": 5126, - "count": 6346, - "max": [ - 1.287977695465088, - 0.8719967007637024, - 0.24143657088279724 - ], - "min": [ - -0.8910231590270996, - -0.2947101294994354, - -1.22649085521698 - ], - "type": "VEC3" - }, - { - "bufferView": 9, - "componentType": 5126, - "count": 6346, - "type": "VEC2" - }, - { - "bufferView": 10, - "componentType": 5126, - "count": 6346, - "type": "VEC3" - }, - { - "bufferView": 11, - "componentType": 5123, - "count": 27702, - "type": "SCALAR" - }, - { - "bufferView": 12, - "componentType": 5126, - "count": 3528, - "max": [ - 0.22877177596092224, - 1.153072476387024, - 0.5660104751586914 - ], - "min": [ - -1.051486849784851, - -0.09016040712594986, - -0.41910019516944885 - ], - "type": "VEC3" - }, - { - "bufferView": 13, - "componentType": 5126, - "count": 3528, - "type": "VEC2" - }, - { - "bufferView": 14, - "componentType": 5126, - "count": 3528, - "type": "VEC3" - }, - { - "bufferView": 15, - "componentType": 5123, - "count": 15564, - "type": "SCALAR" - } - ], - "bufferViews": [ - { - "buffer": 0, - "byteLength": 61500, - "byteOffset": 0, - "target": 34962 - }, - { - "buffer": 0, - "byteLength": 41000, - "byteOffset": 61500, - "target": 34962 - }, - { - "buffer": 0, - "byteLength": 61500, - "byteOffset": 102500, - "target": 34962 - }, - { - "buffer": 0, - "byteLength": 45540, - "byteOffset": 164000, - "target": 34963 - }, - { - "buffer": 0, - "byteLength": 43200, - "byteOffset": 209540, - "target": 34962 - }, - { - "buffer": 0, - "byteLength": 28800, - "byteOffset": 252740, - "target": 34962 - }, - { - "buffer": 0, - "byteLength": 43200, - "byteOffset": 281540, - "target": 34962 - }, - { - "buffer": 0, - "byteLength": 31452, - "byteOffset": 324740, - "target": 34963 - }, - { - "buffer": 0, - "byteLength": 76152, - "byteOffset": 356192, - "target": 34962 - }, - { - "buffer": 0, - "byteLength": 50768, - "byteOffset": 432344, - "target": 34962 - }, - { - "buffer": 0, - "byteLength": 76152, - "byteOffset": 483112, - "target": 34962 - }, - { - "buffer": 0, - "byteLength": 55404, - "byteOffset": 559264, - "target": 34963 - }, - { - "buffer": 0, - "byteLength": 42336, - "byteOffset": 614668, - "target": 34962 - }, - { - "buffer": 0, - "byteLength": 28224, - "byteOffset": 657004, - "target": 34962 - }, - { - "buffer": 0, - "byteLength": 42336, - "byteOffset": 685228, - "target": 34962 - }, - { - "buffer": 0, - "byteLength": 31128, - "byteOffset": 727564, - "target": 34963 - } - ], - "samplers": [ - { - "magFilter": 9729, - "minFilter": 9987 - } - ], - "buffers": [ - { - "byteLength": 758692, - "uri": "shrub_02.bin" - } - ] -} \ No newline at end of file diff --git a/assets/models/polyhaven/shrub_02/textures/shrub_02_arm_1k.jpg b/assets/models/polyhaven/shrub_02/textures/shrub_02_arm_1k.jpg deleted file mode 100644 index 589e56b..0000000 Binary files a/assets/models/polyhaven/shrub_02/textures/shrub_02_arm_1k.jpg and /dev/null differ diff --git a/assets/models/polyhaven/shrub_02/textures/shrub_02_diff_1k.jpg b/assets/models/polyhaven/shrub_02/textures/shrub_02_diff_1k.jpg deleted file mode 100644 index e720907..0000000 Binary files a/assets/models/polyhaven/shrub_02/textures/shrub_02_diff_1k.jpg and /dev/null differ diff --git a/assets/models/polyhaven/shrub_02/textures/shrub_02_nor_gl_1k.jpg b/assets/models/polyhaven/shrub_02/textures/shrub_02_nor_gl_1k.jpg deleted file mode 100644 index 05f76ce..0000000 Binary files a/assets/models/polyhaven/shrub_02/textures/shrub_02_nor_gl_1k.jpg and /dev/null differ diff --git a/blender/README.md b/blender/README.md index d26523c..c202af0 100644 --- a/blender/README.md +++ b/blender/README.md @@ -24,14 +24,15 @@ npm run build:area -- --config config/areas/nantaizi-lake-innovation-valley.json ``` `--geojson` 为可选参数。不提供时,道路使用简单的 OSM highway 折线,而非详细 osm2streets 几何。实际资产生成建议先跑 `intermediates` 阶段,为 Blender 提供 osm2streets 道路面、标线、斑马线和箭头。 -`--tree-style` 可选 `apple`、`fattree`、`natural`、`procedural`。 +`--tree-style` 可选 `shapespark`、`natural`、`procedural`。 -- `apple`(拟真)——SpeedTree Red Delicious,4.5k tris,叶片是 alpha 抠图卡片,带法线贴图。 -- `fattree`(卡通)——低面数卡通树,2.2k tris,纯实体几何,无抠图。 +- `shapespark`——Shapespark low-poly plant kit,12 个确定性树变体,alpha 抠图卡片。 - `natural`——低面数树干 + 多层不规则树冠,不依赖外部模型。 - `procedural`——最轻,球形树冠。 -`apple` 和 `fattree` 依赖 `assets/models/` 下的第三方模型(已 gitignore)。模型缺失时自动回落到 `natural`,干净 checkout 仍可构建;实际使用的样式记录在场景的 `tree_style_used` 属性里。 +`shapespark` 依赖 `assets/models/custom/shapespark_plants/` 下拆分后的第三方模型。 +模型缺失时自动回落到 `natural`,干净 checkout 仍可构建;实际使用的样式记录在场景的 +`tree_style_used` 属性里。 使用 `--office-overrides` 指定一组 OSM way ID(逗号分隔),这些建筑将渲染为办公楼风格,即使其 OSM 标签为 `building=industrial`: diff --git a/blender/export_cesium.py b/blender/export_cesium.py index 53deadf..31d63e2 100644 --- a/blender/export_cesium.py +++ b/blender/export_cesium.py @@ -37,15 +37,13 @@ FOLIAGE_EMISSION = 0.25 # Multiplier on a cut-out foliage albedo before export. # -# This is the knob that actually controls how dark the trees read, and it -# exists because the apple atlas is genuinely dark: its green texels average -# sRGB (0.249, 0.35, 0.12), a deep forest green, and the bark is darker still. -# Rendered at true albedo that is correct — but nothing else in this scene is -# at true albedo. Every other material goes through Cesium export contracts -# (grass mixes 72% toward a bright green, the ribbed facade 86% toward white, -# 0.18 emission on the buildings), all hand-tuned against Cesium's washed-out -# default lighting. A new asset dropped in untuned is the one thing rendering -# honestly, and next to the rest it reads as black. +# This legacy profile exists for dark alpha-cut foliage from older .blend files. +# Rendered at true albedo those assets are correct, but nothing else in this +# scene is at true albedo. Every other material goes through Cesium export +# contracts (grass mixes 72% toward a bright green, the ribbed facade 86% toward +# white, 0.18 emission on the buildings), all hand-tuned against Cesium's +# washed-out default lighting. A new asset dropped in untuned is the one thing +# rendering honestly, and next to the rest it reads as black. # # A gain rather than a tint, because a tint is what the other materials use and # it is wrong here: they are single-surface, this is an atlas holding leaves, @@ -56,15 +54,26 @@ FOLIAGE_ALBEDO_GAIN = 2.1 # Saturation multiplier applied with the gain, around each texel's own # luminance. The gain alone lifts the crown to the right brightness but leaves -# it reading grey-green at distance: this atlas is desaturated to begin with -# (mean saturation 0.22), and mip-averaging a crown mixes leaves with bark and -# sky-gaps, pulling it further toward neutral exactly when the tree gets small. +# it reading grey-green at distance: alpha-cut atlases are often desaturated to +# begin with, and mip-averaging a crown mixes leaves with bark and sky-gaps, +# pulling it further toward neutral exactly when the tree gets small. # # Scaling the distance from luminance pushes the leaves green without touching # what is already neutral much, and without the hue shift a green tint would # force on the trunk — bark just becomes a warmer brown, which it should be. FOLIAGE_SATURATION = 1.75 +# Shapespark foliage is already graded brighter than legacy cut-out foliage. +# Reusing the heavy gain/saturation/emission makes it read yellow-green and +# glowing in Cesium, so these card materials get a gentler export profile. +SHAPESPARK_FOLIAGE_ALBEDO_GAIN = 1.12 +SHAPESPARK_FOLIAGE_SATURATION = 1.0 +SHAPESPARK_FOLIAGE_EMISSION = 0.06 +SHAPESPARK_FOLIAGE_PREFIXES = ( + "branch-", "shrubbery-", "high-grass-", "hedge-", + "clover-", "flowers-", +) + # Legacy fallback for .blend files created before materials carried their own # `cesium_export` custom property. New scenes should get these values from # catalog.MATERIALS[*]["cesium"], serialized by osmassets.materials.from_spec(). @@ -184,11 +193,11 @@ def source_alpha_clipped(material): """Whether the source material carries its silhouette in a texture alpha. Two conditions, because either alone gives a wrong answer. A link into the - Principled Alpha input is not enough: shrub_02 arrives from glTF with a - Math node wired there even though its JPEG diffuse is opaque, and taking - that at face value re-encodes an opaque texture as a PNG and makes Cesium - alpha-test 270 tufts for nothing. An alpha channel alone is not enough - either: fat_tree.png is RGBA with every texel at 1.0. + Principled Alpha input is not enough: retired glTF lawn assets arrived with + a Math node wired there even though the JPEG diffuse was opaque, and taking + that at face value re-encoded an opaque texture as a PNG and made Cesium + alpha-test hundreds of tufts for nothing. An alpha channel alone is not + enough either; it can be fully opaque. So ask both — the author wired alpha, and the texture actually cuts. """ @@ -201,6 +210,17 @@ def source_alpha_clipped(material): return diffuse is not None and image_has_cutout(diffuse) +def foliage_export_profile(material): + name = material.name.lower() + if name.startswith(SHAPESPARK_FOLIAGE_PREFIXES): + return ( + SHAPESPARK_FOLIAGE_ALBEDO_GAIN, + SHAPESPARK_FOLIAGE_SATURATION, + SHAPESPARK_FOLIAGE_EMISSION, + ) + return FOLIAGE_ALBEDO_GAIN, FOLIAGE_SATURATION, FOLIAGE_EMISSION + + _CUTOUT_CACHE = {} @@ -253,12 +273,12 @@ def alpha_dilated_image(source, name, threshold=0.5, passes=8, gain=1.0, saturation=1.0): """Flood the opaque colour outward underneath the cut-out, and lift it. - SpeedTree writes pure black wherever a leaf card is cut away — 97% of the - apple atlas's transparent area is exactly (0, 0, 0). An alpha mask hides - that at full resolution, but Cesium mip-maps the texture and every mip - level averages those black texels into the leaf edges, so the crown grows a - dark fringe that thickens with distance. Blender's preview renders at mip - 0 and never shows it, which is why this only surfaces in the viewer. + Some legacy leaf-card atlases write pure black wherever a card is cut away. + An alpha mask hides that at full resolution, but Cesium mip-maps the texture + and every mip level averages those black texels into the leaf edges, so the + crown grows a dark fringe that thickens with distance. Blender's preview + renders at mip 0 and never shows it, which is why this only surfaces in the + viewer. Replacing the colour under the cut-out with its nearest opaque neighbours leaves no black to bleed. Alpha is copied through untouched, so the @@ -385,6 +405,7 @@ def make_export_material(material): # Foliage that carries its silhouette in the texture's alpha has to keep # that channel; every other material is flattened to opaque below. alpha_clipped = source_alpha_clipped(material) + foliage_gain, foliage_saturation, foliage_emission = foliage_export_profile(material) if material.name == "Tree Crown": diffuse = tree_crown_image() else: @@ -394,7 +415,7 @@ def make_export_material(material): safe_name = material.name.replace(" ", "_") diffuse = alpha_dilated_image( diffuse, f"{EXPORT_PREFIX}{safe_name} Dilated", - gain=FOLIAGE_ALBEDO_GAIN, saturation=FOLIAGE_SATURATION) + gain=foliage_gain, saturation=foliage_saturation) if has_base_color_override: diffuse = None normal = None @@ -454,7 +475,7 @@ def make_export_material(material): elif "Emission" in bsdf.inputs: links.new(diffuse_node.outputs["Color"], bsdf.inputs["Emission"]) if "Emission Strength" in bsdf.inputs: - bsdf.inputs["Emission Strength"].default_value = FOLIAGE_EMISSION + bsdf.inputs["Emission Strength"].default_value = foliage_emission elif "Alpha" in bsdf.inputs: bsdf.inputs["Alpha"].default_value = 1.0 return result diff --git a/blender/generate_scene.py b/blender/generate_scene.py index 10f1caa..f111d68 100644 --- a/blender/generate_scene.py +++ b/blender/generate_scene.py @@ -61,42 +61,39 @@ from osmassets import scrub as _scrub # noqa: E402 from osmassets import tree as _tree # noqa: E402 -MODEL_ROOT = os.path.abspath(os.path.join( - os.path.dirname(__file__), "..", "assets", "models", "polyhaven" -)) CUSTOM_MODEL_ROOT = os.path.abspath(os.path.join( os.path.dirname(__file__), "..", "assets", "models", "custom" )) -# Vendored under the name shrub_02, but the plant reads as a tufted grass, not -# as a bush: it belongs on the lawns. Scrub beds stay flat ground cover until a -# genuinely bush-shaped asset is sourced. -TUFT_MODEL = os.path.join(MODEL_ROOT, "shrub_02", "shrub_02_1k.gltf") -# Poly Haven ships it at ~27k triangles across four variants. The leaves are -# modelled as real geometry, so decimation eats them: at ~2.2k per variant the -# tufts render as bare twigs. Instancing makes the full mesh affordable anyway — -# every tuft shares one of four datablocks, so the scene and the exported GLB -# carry that geometry once no matter how many are scattered. 0 disables it. +# Shapespark grass variants replace the former high-detail lawn tuft asset. +# They are alpha-cut cards at about 10 tris each, so the shared geometry is +# tiny and each lawn instance links one of these datablocks. +TUFT_MODELS = ( + os.path.join(CUSTOM_MODEL_ROOT, "shapespark_plants", "grass-01", "model.gltf"), + os.path.join(CUSTOM_MODEL_ROOT, "shapespark_plants", "grass-02", "model.gltf"), + os.path.join(CUSTOM_MODEL_ROOT, "shapespark_plants", "grass-03", "model.gltf"), +) TUFT_TARGET_TRIS = 0 -# The variants stand 1.17-1.68m tall natively, which is shrub height. Roughly a -# third of that lands in the 0.3-0.8m range real lawn tufts occupy. +# The variants stand 1.2-1.34m tall natively. Roughly a third of that lands in +# the 0.3-0.6m range real lawn tufts occupy. TUFT_SCALE_RANGE = (0.26, 0.46) TUFT_SPACING = 1.7 TUFT_LIMIT_PER_LAWN = 100 -# The vendored diffuse is a grey-green leaf over brown stems. Dropped onto the +# The Shapespark diffuse is a grey-green leaf over brown stems. Dropped onto the # saturated lawn as-is it reads as dead weeds, so the base colour is mixed -# toward the lawn tint, a shade brighter so the tufts still separate from it. -TUFT_TINT = (0.15, 0.52, 0.09) -TUFT_TINT_FACTOR = 0.66 +# toward a cooler lawn tint without making the cards glow. +TUFT_TINT = (0.08, 0.30, 0.055) +TUFT_TINT_FACTOR = 0.22 -SCRUB_BUSH_MODEL = os.path.join(CUSTOM_MODEL_ROOT, "bush", "bush.glb") +SCRUB_BUSH_MODEL = os.path.join( + CUSTOM_MODEL_ROOT, "shapespark_plants", "bush-03", "model.gltf") SCRUB_BUSH_SPACING = 1.8 SCRUB_BUSH_INSET = 0.38 SCRUB_BUSH_LIMIT_PER_PATCH = 60 SCRUB_BUSH_HEIGHT = 1.575 SCRUB_BUSH_SCALE_JITTER = 0.16 -SCRUB_BUSH_LEAF_TINT = (0.075, 0.31, 0.055) -SCRUB_BUSH_LEAF_TINT_FACTOR = 0.36 +SCRUB_BUSH_LEAF_TINT = (0.055, 0.23, 0.045) +SCRUB_BUSH_LEAF_TINT_FACTOR = 0.18 SCRUB_BUSH_TRUNK_TINT = (0.13, 0.095, 0.055) SCRUB_BUSH_TRUNK_TINT_FACTOR = 0.18 SCRUB_TREE_MIN_AREA = 45.0 @@ -105,9 +102,9 @@ SCRUB_TREE_EDGE_CLEARANCE = 2.8 SCRUB_TREE_LIMIT_PER_PATCH = 5 SCRUB_TREE_HEIGHT_RANGE = (4.6, 6.2) -# Tree styles. The two built from mesh batches live in this file; the rest are -# vendored models handled by osmassets.tree, which owns that list. A model style -# whose asset is missing falls back to "natural" rather than planting nothing. +# Tree styles. The two built from mesh batches live in this file; Shapespark +# model trees are handled by osmassets.tree. A model style whose asset is +# missing falls back to "natural" rather than planting nothing. TREE_STYLES = frozenset(("natural", "procedural")) | frozenset(_tree.MODEL_STYLES) @@ -296,54 +293,84 @@ def add_natural_tree_instances(positions, collection, trunk_material, upper.finish() +def _numbered_base_name(name): + if len(name) > 4 and name[-4] == "." and name[-3:].isdigit(): + return name[:-4] + return name + + +def _dedupe_imported_material(material, tinted, tint_factor): + name = _numbered_base_name(material.name) + existing = bpy.data.materials.get(name) + if existing and existing is not material: + return existing + material.name = name + if getattr(material, "blend_method", "OPAQUE") == "BLEND": + material.blend_method = "HASHED" + material.alpha_threshold = 0.45 + material.show_transparent_back = False + if material.name not in tinted: + tint_base_color(material, TUFT_TINT, tint_factor) + tinted.add(material.name) + return material + + def load_tuft_variants(): - """Import the vendored Poly Haven plant once and return decimated meshes. + """Import Shapespark grass variants and return shared tuft meshes. Returns [] when the asset is missing so a clean checkout still builds; the lawns then fall back to plain textured ground. """ - if not os.path.exists(TUFT_MODEL): - return [] - before = set(bpy.data.objects) - try: - bpy.ops.import_scene.gltf(filepath=TUFT_MODEL) - except (RuntimeError, AttributeError) as error: - print("Grass tuft import failed, lawns stay flat:", error) + if not all(os.path.exists(path) for path in TUFT_MODELS): return [] - imported = [obj for obj in set(bpy.data.objects) - before if obj.type == "MESH"] + before_materials = set(bpy.data.materials) + before_images = set(bpy.data.images) variants = [] tinted = set() - for obj in sorted(imported, key=lambda item: item.name): - obj.data.calc_loop_triangles() - source_tris = len(obj.data.loop_triangles) - if TUFT_TARGET_TRIS and source_tris > TUFT_TARGET_TRIS: - modifier = obj.modifiers.new("TuftDecimate", "DECIMATE") - modifier.ratio = max(0.02, TUFT_TARGET_TRIS / source_tris) - bpy.context.view_layer.update() - evaluated = obj.evaluated_get(bpy.context.evaluated_depsgraph_get()) - mesh = bpy.data.meshes.new_from_object(evaluated) - else: - mesh = obj.data.copy() - mesh.name = "GrassTuft_" + obj.name - mesh.calc_loop_triangles() - # Nothing is saved yet at this point, so keep the datablock alive even - # if a scene ends up with no lawn polygons to instance it into. - mesh.use_fake_user = True - for material in mesh.materials: - # The vendored textures are JPEG with no alpha channel, so hashed - # transparency only costs sorting work in Blender and Cesium. - if hasattr(material, "blend_method"): - material.blend_method = "OPAQUE" - # All four variants share one material, so guard against stacking - # the mix node — and the tint with it — four times over. - if material.name not in tinted: - tint_base_color(material, TUFT_TINT, TUFT_TINT_FACTOR) - tinted.add(material.name) - variants.append(mesh) + for model_path in TUFT_MODELS: + before = set(bpy.data.objects) + try: + bpy.ops.import_scene.gltf(filepath=model_path) + except (RuntimeError, AttributeError) as error: + print("Grass tuft import failed, lawns stay flat:", error) + return [] - for obj in imported: - bpy.data.objects.remove(obj, do_unlink=True) + imported = [obj for obj in set(bpy.data.objects) - before if obj.type == "MESH"] + for obj in sorted(imported, key=lambda item: item.name): + obj.data.calc_loop_triangles() + source_tris = len(obj.data.loop_triangles) + if TUFT_TARGET_TRIS and source_tris > TUFT_TARGET_TRIS: + modifier = obj.modifiers.new("TuftDecimate", "DECIMATE") + modifier.ratio = max(0.02, TUFT_TARGET_TRIS / source_tris) + bpy.context.view_layer.update() + evaluated = obj.evaluated_get(bpy.context.evaluated_depsgraph_get()) + mesh = bpy.data.meshes.new_from_object(evaluated) + else: + mesh = _bake_imported_mesh(obj, "GrassTuft_" + obj.name) + mesh.name = "GrassTuft_" + _numbered_base_name(obj.name) + mesh.calc_loop_triangles() + # Nothing is saved yet at this point, so keep the datablock alive + # even if a scene ends up with no lawn polygons to instance it into. + mesh.use_fake_user = True + for slot, material in enumerate(mesh.materials): + if material is not None: + mesh.materials[slot] = _dedupe_imported_material( + material, tinted, TUFT_TINT_FACTOR) + variants.append(mesh) + + for obj in imported: + mesh = obj.data if obj.type == "MESH" else None + bpy.data.objects.remove(obj, do_unlink=True) + if mesh is not None and mesh.users == 0: + bpy.data.meshes.remove(mesh) + + for material in set(bpy.data.materials) - before_materials: + if material.users == 0: + bpy.data.materials.remove(material) + for image in set(bpy.data.images) - before_images: + if image.users == 0: + bpy.data.images.remove(image) tris = sum(len(mesh.loop_triangles) for mesh in variants) detail = f"decimated to ~{TUFT_TARGET_TRIS} tris each" if TUFT_TARGET_TRIS else "full detail" @@ -462,7 +489,8 @@ def load_scrub_bush_variant(): if material is None: continue material_name = material.name.lower() - if "leaf" in material_name: + if ("leaf" in material_name or "branch" in material_name or + "shrubbery" in material_name or "hedge" in material_name): tint_base_color( material, SCRUB_BUSH_LEAF_TINT, SCRUB_BUSH_LEAF_TINT_FACTOR) diff --git a/blender/osmassets/tree.py b/blender/osmassets/tree.py index d7c5c94..06c66b3 100644 --- a/blender/osmassets/tree.py +++ b/blender/osmassets/tree.py @@ -1,26 +1,27 @@ """Instanced tree assets — the model side of `--tree-style`. -Two vendored models, reduced to one runtime shape: import once, bake the source -object's orientation into a mesh copy, measure it, then link one lightweight -object per tree that reuses that datablock. Nothing is duplicated per tree, so -the .blend and the exported GLB carry each mesh and each texture exactly once -no matter how many trees are planted. +The Shapespark low-poly plant kit is reduced to runtime variants by importing +each split glTF once, baking the source object's orientation into a mesh copy, +measuring it, then linking one lightweight object per tree that reuses that +datablock. Nothing is duplicated per tree, so the .blend and the exported GLB +carry each mesh and each texture exactly once no matter how many trees are +planted. - apple SpeedTree Red Delicious, 4.5k tris, alpha-cut leaf cards - fattree low-poly cartoon tree, 2.2k tris, opaque geometry - -Materials are rebuilt here rather than taken from the source files, because -neither arrives usable. 57% of the apple's colour texture is transparent — -those are leaf cards, and without an alpha-clipped setup the crown renders as a -solid ball of intersecting quads. fattree ships a bare Diffuse BSDF and a -texture path that only resolves next to the original .blend. +Materials from split glTF files are reused by base name because Blender creates +`branch-01.001`, `branch-01.002`, ... duplicates across imports even when the +images are shared by filepath. Deduping material slots keeps the Cesium exporter +from baking the same foliage texture many times. A third style, `polyhaven`, used to live here. It appended what the Poly Haven island_tree_01 file calls its LOD1 objects, but those are not whole trees: the branch parts are 0.4-unit twigs and the leaf parts are flat clusters hanging below their own origin, both meant to be scattered by the geometry-nodes setup in that file. Planting them directly gave twigs, which is what sent us looking -for these two models. Removed along with the 78MB asset. +for other tree assets. Removed along with the 78MB asset. + +Older model tree styles were also retired after Shapespark trees proved +visually better and lighter for the Cesium preview. Their detailed experiment +notes live in `docs/changelog.md` and the Trellis asset-generation spec. """ import math @@ -29,26 +30,21 @@ from collections import namedtuple import bpy -from osmassets.materials import link_alpha_clip - MODEL_ROOT = os.path.abspath(os.path.join( os.path.dirname(os.path.abspath(__file__)), "..", "..", "assets", "models", )) -APPLE_DIR = os.path.join(MODEL_ROOT, "speedtree", "apple_low") -APPLE_OBJ = os.path.join(APPLE_DIR, "RedDeliciousApple.obj") -APPLE_COLOR = os.path.join(APPLE_DIR, "textures", "apple_color_2k.png") -APPLE_NORMAL = os.path.join(APPLE_DIR, "textures", "apple_normal_2k.png") - -FATTREE_DIR = os.path.join(MODEL_ROOT, "lyrog", "fattree") -FATTREE_BLEND = os.path.join(FATTREE_DIR, "fattree.blend") -FATTREE_COLOR = os.path.join(FATTREE_DIR, "textures", "fat_tree.png") +SHAPESPARK_DIR = os.path.join(MODEL_ROOT, "custom", "shapespark_plants") +SHAPESPARK_TREE_IDS = ( + "tree-01-1", "tree-01-2", "tree-01-3", "tree-01-4", + "tree-02-1", "tree-02-2", "tree-02-3", "tree-02-4", + "tree-03-1", "tree-03-2", "tree-03-3", "tree-03-4", +) MIN_TREE_HEIGHT = 4.0 -# Leaf cards are cut at half opacity: the apple atlas's alpha is near-binary -# already, so a different threshold only changes edge thickness. +# Shapespark leaf cards use alpha-cut foliage textures. ALPHA_CUTOFF = 0.5 # Golden angle. Successive trees face directions that never repeat and never # settle into a pattern, so a tree_row reads as planted rather than stamped. @@ -71,13 +67,11 @@ def _bake(obj, name): """Copy obj's mesh with its rotation and scale applied, but not its position. - Orientation has to be baked: the OBJ importer leaves the apple's Y-up to - Z-up conversion sitting on the object, so a raw mesh copy would plant the - tree on its side. Position must *not* be, because a source file's - translation is where the artist parked the model in their own scene — - fattree sits 2.9m up in the air — and baking that in would offset every - instance by it. Dropping it costs nothing: `base_z` measures whatever - ground line the mesh ends up with, and assemble() corrects for it. + Orientation has to be baked because imported glTF objects may carry source + rotations or scale on the object. Position must not be baked: a source + file's translation is where the artist parked the model in its own scene, + and `base_z` measures whatever ground line the mesh ends up with so + assemble() can correct for it per instance. """ mesh = obj.data.copy() mesh.transform(obj.matrix_world.to_3x3().to_4x4()) @@ -112,9 +106,9 @@ def _discard(objects): def _purge_orphans(before_materials, before_images): """Drop the materials and images an import created that nothing now uses. - Both importers build a material from the source file's own description and - load its textures. We replace that material, so without this the .blend - ships a second, unreferenced copy of every 2k texture. + glTF import creates temporary datablocks for source material descriptions. + Once split-asset duplicates are collapsed, unused leftovers should not stay + packed into the .blend. """ for material in set(bpy.data.materials) - before_materials: if material.users == 0: @@ -124,148 +118,91 @@ def _purge_orphans(before_materials, before_images): bpy.data.images.remove(image) -def _image(path, non_color=False): - """Load a texture once, keyed by filename so repeat calls share it.""" - key = os.path.basename(path) - image = bpy.data.images.get(key) - if image is None: - image = bpy.data.images.load(path) - image.name = key - if non_color: - image.colorspace_settings.name = "Non-Color" - return image +def _base_name(name): + if len(name) > 4 and name[-4] == "." and name[-3:].isdigit(): + return name[:-4] + return name -def _foliage_material(name, color_path, normal_path=None, alpha_clip=False, - roughness=0.72): - """Principled setup for a textured tree, alpha-clipped when asked. +def _dedupe_material(material): + """Reuse an already-loaded material with the same base name. - The cut-out goes through materials.link_alpha_clip rather than straight - into the Alpha socket — see that function for why the extra two nodes are - what makes the crown survive the trip to Cesium. + Importing many split Shapespark glTFs shares image datablocks by filepath, + but still creates `branch-01.001`, `branch-01.002`, ... material copies. + Those names would make the Cesium exporter bake duplicate export materials, + so collapse them back to the first material for each base name. """ - material = bpy.data.materials.get(name) - if material: - return material - - material = bpy.data.materials.new(name) - material.use_nodes = True - nodes = material.node_tree.nodes - links = material.node_tree.links - bsdf = next(n for n in nodes if n.type == "BSDF_PRINCIPLED") - bsdf.inputs["Roughness"].default_value = roughness - bsdf.inputs["Metallic"].default_value = 0.0 - - color_tex = nodes.new("ShaderNodeTexImage") - color_tex.image = _image(color_path) - color_tex.location = (-540, 260) - links.new(color_tex.outputs["Color"], bsdf.inputs["Base Color"]) - - if normal_path and os.path.exists(normal_path): - normal_tex = nodes.new("ShaderNodeTexImage") - normal_tex.image = _image(normal_path, non_color=True) - normal_tex.location = (-540, -140) - normal_map = nodes.new("ShaderNodeNormalMap") - normal_map.location = (-250, -140) - links.new(normal_tex.outputs["Color"], normal_map.inputs["Color"]) - links.new(normal_map.outputs["Normal"], bsdf.inputs["Normal"]) - - if alpha_clip: - link_alpha_clip(material, color_tex.outputs["Alpha"], bsdf, - cutoff=ALPHA_CUTOFF) + name = _base_name(material.name) + existing = bpy.data.materials.get(name) + if existing and existing is not material: + return existing + material.name = name + if getattr(material, "blend_method", "OPAQUE") == "BLEND": + material.blend_method = "HASHED" + material.alpha_threshold = ALPHA_CUTOFF + material.show_transparent_back = False return material # -------------------------------------------------------------------------- -# loaders — each returns [] when its model is absent, so a clean checkout -# still builds and the caller falls back to procedural trees +# loader — returns [] when its model is absent, so a clean checkout still builds +# and the caller falls back to procedural trees -def _load_apple(): - """SpeedTree Red Delicious: one mesh, alpha-cut leaf cards, normal-mapped.""" - if not os.path.exists(APPLE_OBJ): - return [] +def _load_shapespark(): + """Shapespark low-poly plant kit: 12 alpha-cut tree variants. - # Build ours first: the OBJ importer reuses an already-loaded image when the - # .mtl resolves to the same file, so the 2k textures land in the file once. - material = _foliage_material("AppleTree", APPLE_COLOR, APPLE_NORMAL, - alpha_clip=True, roughness=0.68) - - before_objects = set(bpy.data.objects) - before_materials = set(bpy.data.materials) - before_images = set(bpy.data.images) - bpy.ops.wm.obj_import(filepath=APPLE_OBJ) - imported = [obj for obj in set(bpy.data.objects) - before_objects - if obj.type == "MESH"] - if not imported: - return [] - - meshes = [] - for index, obj in enumerate(imported): - mesh = _bake(obj, "AppleTree_%02d" % index) - mesh.materials.clear() - mesh.materials.append(material) - meshes.append(mesh) - height, base_z = _measure(meshes) - - _discard(imported) - _purge_orphans(before_materials, before_images) - return [TreeVariant(meshes, height, base_z)] - - -def _load_fattree(): - """Low-poly cartoon tree: opaque geometry, one diffuse texture. - - The crown is real geometry and the texture's alpha is 1.0 everywhere, so - unlike the apple this needs no cut-out — and no normal map, which the - source does not ship. + The split assets keep one glTF/bin per plant and a shared texture directory. + Each variant is imported once, baked into a mesh datablock, then its source + object is discarded; individual OSM trees link those datablocks. """ - if not os.path.exists(FATTREE_BLEND): - return [] - - before_objects = set(bpy.data.objects) + variants = [] before_materials = set(bpy.data.materials) before_images = set(bpy.data.images) - try: - bpy.ops.wm.append( - filepath=FATTREE_BLEND + "/Object/fattree", - directory=FATTREE_BLEND + "/Object/", - files=[{"name": "fattree"}], - link=False, - ) - except RuntimeError: + paths = [ + os.path.join(SHAPESPARK_DIR, tree_id, "model.gltf") + for tree_id in SHAPESPARK_TREE_IDS + ] + if not all(os.path.exists(path) for path in paths): return [] - imported = [obj for obj in set(bpy.data.objects) - before_objects - if obj.type == "MESH"] - obj = bpy.data.objects.get("fattree") - if obj is None: + for tree_id, path in zip(SHAPESPARK_TREE_IDS, paths): + before_objects = set(bpy.data.objects) + try: + bpy.ops.import_scene.gltf(filepath=path) + except RuntimeError: + return [] + + imported = [obj for obj in set(bpy.data.objects) - before_objects + if obj.type == "MESH"] + if not imported: + return [] + + meshes = [] + for index, obj in enumerate(sorted(imported, key=lambda item: item.name)): + mesh = _bake(obj, "Shapespark_%s_%02d" % (tree_id, index)) + for slot, material in enumerate(mesh.materials): + if material is not None: + mesh.materials[slot] = _dedupe_material(material) + meshes.append(mesh) + + height, base_z = _measure(meshes) + variants.append(TreeVariant(meshes, height, base_z)) _discard(imported) - _purge_orphans(before_materials, before_images) - return [] - material = _foliage_material("FatTree", FATTREE_COLOR, alpha_clip=False, - roughness=0.85) - mesh = _bake(obj, "FatTree") - mesh.materials.clear() - mesh.materials.append(material) - height, base_z = _measure([mesh]) - - _discard(imported) _purge_orphans(before_materials, before_images) - return [TreeVariant([mesh], height, base_z)] + return variants LOADERS = { - "apple": _load_apple, - "fattree": _load_fattree, + "shapespark": _load_shapespark, } # The styles this module can serve, for the CLI to validate against. MODEL_STYLES = tuple(LOADERS) -def assemble(positions, collection, style="apple"): +def assemble(positions, collection, style="shapespark"): """Place instanced trees of `style` at `positions`. positions is a list of (x, y, height) tuples as gathered by the two @@ -286,7 +223,7 @@ def assemble(positions, collection, style="apple"): return 0 for index, (x, y, target_height) in enumerate(positions): - variant = variants[index % len(variants)] + variant = variants[int(((index * GOLDEN_TURN) % 1.0) * len(variants))] # Irrational periods stand in for an RNG: no repeat over any realistic # tree count, and a pure function of the index, so rebuilding an area # plants the identical forest. diff --git a/config/areas/nantaizi-lake-innovation-valley.json b/config/areas/nantaizi-lake-innovation-valley.json index 2d2c301..96b3a9d 100644 --- a/config/areas/nantaizi-lake-innovation-valley.json +++ b/config/areas/nantaizi-lake-innovation-valley.json @@ -29,7 +29,7 @@ "osm2lanes": true }, "blender": { - "treeStyle": "apple", + "treeStyle": "shapespark", "officeOverrides": "" } } diff --git a/docs/changelog.md b/docs/changelog.md index d09a0c0..645af8e 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -2,6 +2,16 @@ ## 2026-08-03 +- 固化 Shapespark low-poly plants kit 作为当前植被资产来源:`nantaizi-lake-innovation-valley` + 使用 `treeStyle: shapespark`、12 个确定性树变体、`bush-03` scrub 边缘灌木、 + `grass-01/02/03` 草坪草簇;Cesium 对 Shapespark cut-out 材质走单独温和 profile + `gain=1.12` / `saturation=1.0` / `emission=0.06`,避免沿用旧深色树贴图 profile + 导致黄绿发光。nantaizi GLB 为 `20.50 MB`、`830` nodes、`32` materials、`18` + images;树共享几何为 `12` mesh / `6,255` vertices / `18,696` indices,草簇共享 + 几何为 `3` mesh / `84` vertices / `90` indices,scrub bush 为 `1` mesh / + `108` vertices / `162` indices。删除已被替代或拒绝的旧资产:SpeedTree apple、 + Lyrog fattree、Poly Haven `shrub_02`、原始高模 `custom/bush` 和 rejected + `custom/bush_low`,并移除 `apple` / `fattree` tree loader 代码。 - 初始化 Trellis 项目规范,把 `trellis init` 误生成的 frontend spec 替换为本项目真实的 `pipeline` / `blender` / `preview` / `config` 四层规范,并把跨层 parity、图层顺序、 外部工具 staging、纯 Python / bpy 边界等反直觉约定固化到 `.trellis/spec/`。 @@ -47,7 +57,7 @@ - 试验用户提供的 `assets/models/custom/bush_low/bush_low.glb` 作为低模灌木:几何从 `63,762` vertices / `67,536` indices 降到 `4,044` / `4,050`,nantaizi GLB `31.96 MB -> 27.51 MB`,scrub bush nodes 仍为 `266`。但用户实测视觉效果不理想, - 不设为默认;当前仍使用 `assets/models/custom/bush/bush.glb`。 + 不设为默认;后续由 Shapespark `bush-03` 替代并删除旧 bush 资产。 ## 2026-07-31(三)远看发黑的真正原因:反照率没被提亮