mirror of
https://git.mirrors.martin98.com/https://github.com/syoyo/tinygltf.git
synced 2025-08-12 15:59:01 +08:00
Support concatinating multiple glTF files.
This commit is contained in:
parent
5dcf778b31
commit
6224e021ce
@ -6,12 +6,21 @@ Append(merge) mesh of glTF A to glTF B.
|
|||||||
|
|
||||||
`skin`, `nodes`, etc are not appended(to be merged).
|
`skin`, `nodes`, etc are not appended(to be merged).
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
concatenate sourceN.gltf to target.gltf and save it to merged.gltf
|
||||||
|
|
||||||
|
```
|
||||||
|
$ python concat_mesh.py source0.gltf <source1.gltf source2.gltf ...> target.gltf merged.gltf
|
||||||
|
```
|
||||||
|
|
||||||
## TODO
|
## TODO
|
||||||
|
|
||||||
* [ ] Support multiple glTFs to merge
|
* [x] Support multiple glTFs to merge(concat)
|
||||||
* [ ] Support merging skin
|
* [ ] Support merging skin
|
||||||
* [ ] Support merging different node hierarchies
|
* [ ] Support merging different node hierarchies
|
||||||
* [ ] `images`, `textures`
|
* [ ] Support `images`, `textures`, `materials`
|
||||||
|
* [ ] Support other glTF info
|
||||||
|
|
||||||
# replace_attrib.py
|
# replace_attrib.py
|
||||||
|
|
||||||
|
@ -1,20 +1,116 @@
|
|||||||
# concat mesh to glTF
|
# concat mesh to glTF
|
||||||
|
# support multiple source glTF to me concatenated to target.gltf
|
||||||
|
|
||||||
import json
|
import json
|
||||||
import sys, os
|
import sys, os
|
||||||
|
|
||||||
prefix = "added/"
|
g_prefix = "added/"
|
||||||
|
|
||||||
|
def concat(source, target, offsets, prefix, extraInfo):
|
||||||
|
# Args:
|
||||||
|
# source: dict(modified), target: dict(modified),
|
||||||
|
# offsets: dict(modified). contains offset table.
|
||||||
|
# prefix: str
|
||||||
|
# extraInfo: dict(inout)
|
||||||
|
|
||||||
|
num_source_meshes = len(source["meshes"])
|
||||||
|
num_source_buffers = len(source["buffers"])
|
||||||
|
num_source_bufferViews = len(source["bufferViews"])
|
||||||
|
num_source_accessors = len(source["accessors"])
|
||||||
|
num_source_materials = len(source["materials"]) if "materials" in source else 0
|
||||||
|
print("src =====")
|
||||||
|
print("num_src_meshes: ", num_source_meshes)
|
||||||
|
print("num_src_buffers: ", num_source_buffers)
|
||||||
|
print("num_src_bufferViews: ", num_source_bufferViews)
|
||||||
|
print("num_src_accessors: ", num_source_accessors)
|
||||||
|
print("num_src_materials: ", num_source_materials)
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Adjust name and index offset
|
||||||
|
#
|
||||||
|
for i in range(len(source["buffers"])):
|
||||||
|
if "name" in source["buffers"][i]:
|
||||||
|
source["buffers"][i]["name"] = prefix + source["buffers"][i]["name"]
|
||||||
|
|
||||||
|
for i in range(len(source["bufferViews"])):
|
||||||
|
if "name" in source["bufferViews"][i]:
|
||||||
|
source["bufferViews"][i]["name"] = prefix + source["bufferViews"][i]["name"]
|
||||||
|
|
||||||
|
source["bufferViews"][i]["buffer"] += offsets["buffers"]
|
||||||
|
|
||||||
|
for i in range(len(source["accessors"])):
|
||||||
|
if "name" in source["accessors"][i]:
|
||||||
|
source["accessors"][i]["name"] = prefix + source["accessors"][i]["name"]
|
||||||
|
|
||||||
|
source["accessors"][i]["bufferView"] += offsets["bufferViews"]
|
||||||
|
|
||||||
|
for i in range(len(source["meshes"])):
|
||||||
|
mesh = source["meshes"][i]
|
||||||
|
|
||||||
|
if "name" in mesh:
|
||||||
|
source["meshes"][i]["name"] = prefix + source["meshes"][i]["name"]
|
||||||
|
|
||||||
|
for primid in range(len(mesh["primitives"])):
|
||||||
|
for attrib in mesh["primitives"][primid]["attributes"]:
|
||||||
|
#print(source["meshes"][i]["primitives"][primid]["attributes"][attrib])
|
||||||
|
source["meshes"][i]["primitives"][primid]["attributes"][attrib] += offsets["accessors"]
|
||||||
|
|
||||||
|
|
||||||
|
source["meshes"][i]["primitives"][primid]["indices"] += offsets["accessors"]
|
||||||
|
if "material" in source["meshes"][i]["primitives"][primid]:
|
||||||
|
source["meshes"][i]["primitives"][primid]["material"] += offsets["materials"]
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Append mesh info
|
||||||
|
#
|
||||||
|
target["buffers"] += source["buffers"]
|
||||||
|
target["bufferViews"] += source["bufferViews"]
|
||||||
|
target["meshes"] += source["meshes"]
|
||||||
|
target["accessors"] += source["accessors"]
|
||||||
|
if "materials" in source:
|
||||||
|
target["materials"] += source["materials"]
|
||||||
|
|
||||||
|
# assume `prefix` is unique
|
||||||
|
extraInfo["num_{}_meshes".format(prefix)] = num_source_meshes
|
||||||
|
extraInfo["num_{}_buffers".format(prefix)] = num_source_buffers
|
||||||
|
extraInfo["num_{}_bufferViews".format(prefix)] = num_source_bufferViews
|
||||||
|
extraInfo["num_{}_accessors".format(prefix)] = num_source_accessors
|
||||||
|
extraInfo["num_{}_materials".format(prefix)] = num_source_materials
|
||||||
|
|
||||||
|
# update offsets
|
||||||
|
offsets["meshes"] += num_source_meshes
|
||||||
|
offsets["buffers"] += num_source_buffers
|
||||||
|
offsets["bufferViews"] += num_source_bufferViews
|
||||||
|
offsets["accessors"] += num_source_accessors
|
||||||
|
offsets["materials"] += num_source_materials
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
if len(sys.argv) < 4:
|
if len(sys.argv) < 4:
|
||||||
print("Needs source.gltf target.gltf output.gltf")
|
print("Needs source0.gltf <source1.gltf, ...> target.gltf output.gltf")
|
||||||
sys.exit(-1)
|
sys.exit(-1)
|
||||||
|
|
||||||
source_filename = sys.argv[1]
|
num_args = len(sys.argv)
|
||||||
target_filename = sys.argv[2]
|
print("num_args = ", num_args)
|
||||||
output_filename = sys.argv[3]
|
|
||||||
|
|
||||||
source = json.loads(open(source_filename).read())
|
source_filenames = []
|
||||||
|
|
||||||
|
num_srcs = num_args - 3
|
||||||
|
|
||||||
|
for i in range(num_srcs):
|
||||||
|
source_filenames.append(sys.argv[1+i])
|
||||||
|
print("source[{}] = {}".format(i, sys.argv[1+i]))
|
||||||
|
|
||||||
|
target_filename = sys.argv[num_args - 2]
|
||||||
|
output_filename = sys.argv[num_args - 1]
|
||||||
|
print("target = ", target_filename)
|
||||||
|
print("output = ", output_filename)
|
||||||
|
|
||||||
|
sources = []
|
||||||
|
for i in range(num_srcs):
|
||||||
|
sources.append(json.loads(open(source_filenames[i]).read()))
|
||||||
target = json.loads(open(target_filename).read())
|
target = json.loads(open(target_filename).read())
|
||||||
|
|
||||||
num_target_meshes = len(target["meshes"])
|
num_target_meshes = len(target["meshes"])
|
||||||
@ -28,65 +124,8 @@ def main():
|
|||||||
print("num_target_accessors: ", num_target_accessors)
|
print("num_target_accessors: ", num_target_accessors)
|
||||||
print("num_target_materials: ", num_target_accessors)
|
print("num_target_materials: ", num_target_accessors)
|
||||||
|
|
||||||
num_source_meshes = len(source["meshes"])
|
|
||||||
num_source_buffers = len(source["buffers"])
|
|
||||||
num_source_bufferViews = len(source["bufferViews"])
|
|
||||||
num_source_accessors = len(source["accessors"])
|
|
||||||
num_source_materials = len(source["materials"]) if "materials" in source else 0
|
|
||||||
print("num_source_meshes: ", num_source_meshes)
|
|
||||||
print("num_source_buffers: ", num_source_buffers)
|
|
||||||
print("num_source_bufferViews: ", num_source_bufferViews)
|
|
||||||
print("num_source_accessors: ", num_source_accessors)
|
|
||||||
print("num_source_materials: ", num_source_materials)
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Adjust name and index
|
# add some info to asset.extras
|
||||||
#
|
|
||||||
for i in range(len(source["buffers"])):
|
|
||||||
if "name" in source["buffers"][i]:
|
|
||||||
source["buffers"][i]["name"] = prefix + source["buffers"][i]["name"]
|
|
||||||
|
|
||||||
for i in range(len(source["bufferViews"])):
|
|
||||||
if "name" in source["bufferViews"][i]:
|
|
||||||
source["bufferViews"][i]["name"] = prefix + source["bufferViews"][i]["name"]
|
|
||||||
|
|
||||||
source["bufferViews"][i]["buffer"] += num_target_buffers
|
|
||||||
|
|
||||||
for i in range(len(source["accessors"])):
|
|
||||||
if "name" in source["accessors"][i]:
|
|
||||||
source["accessors"][i]["name"] = prefix + source["accessors"][i]["name"]
|
|
||||||
|
|
||||||
source["accessors"][i]["bufferView"] += num_target_bufferViews
|
|
||||||
|
|
||||||
for i in range(len(source["meshes"])):
|
|
||||||
mesh = source["meshes"][i]
|
|
||||||
|
|
||||||
if "name" in mesh:
|
|
||||||
source["meshes"][i]["name"] = prefix + source["meshes"][i]["name"]
|
|
||||||
|
|
||||||
for primid in range(len(mesh["primitives"])):
|
|
||||||
for attrib in mesh["primitives"][primid]["attributes"]:
|
|
||||||
#print(source["meshes"][i]["primitives"][primid]["attributes"][attrib])
|
|
||||||
source["meshes"][i]["primitives"][primid]["attributes"][attrib] += num_target_accessors
|
|
||||||
|
|
||||||
|
|
||||||
source["meshes"][i]["primitives"][primid]["indices"] += num_target_accessors
|
|
||||||
if "material" in source["meshes"][i]["primitives"][primid]:
|
|
||||||
source["meshes"][i]["primitives"][primid]["material"] += num_target_materials
|
|
||||||
|
|
||||||
|
|
||||||
#
|
|
||||||
# Append mesh info
|
|
||||||
#
|
|
||||||
target["buffers"] += source["buffers"]
|
|
||||||
target["bufferViews"] += source["bufferViews"]
|
|
||||||
target["meshes"] += source["meshes"]
|
|
||||||
target["accessors"] += source["accessors"]
|
|
||||||
if "materials" in source:
|
|
||||||
target["materials"] += source["materials"]
|
|
||||||
|
|
||||||
#
|
|
||||||
# add some info
|
|
||||||
#
|
#
|
||||||
extraInfo = {}
|
extraInfo = {}
|
||||||
extraInfo["num_target_meshes"] = num_target_meshes
|
extraInfo["num_target_meshes"] = num_target_meshes
|
||||||
@ -95,11 +134,24 @@ def main():
|
|||||||
extraInfo["num_target_accessors"] = num_target_accessors
|
extraInfo["num_target_accessors"] = num_target_accessors
|
||||||
extraInfo["num_target_materials"] = num_target_materials
|
extraInfo["num_target_materials"] = num_target_materials
|
||||||
|
|
||||||
extraInfo["num_source_meshes"] = num_source_meshes
|
offsets = {}
|
||||||
extraInfo["num_source_buffers"] = num_source_buffers
|
offsets["meshes"] = num_target_meshes
|
||||||
extraInfo["num_source_bufferViews"] = num_source_bufferViews
|
offsets["buffers"] = num_target_buffers
|
||||||
extraInfo["num_source_accessors"] = num_source_accessors
|
offsets["bufferViews"] = num_target_bufferViews
|
||||||
extraInfo["num_source_materials"] = num_source_materials
|
offsets["accessors"] = num_target_accessors
|
||||||
|
offsets["materials"] = num_target_materials
|
||||||
|
|
||||||
|
for i in range(num_srcs):
|
||||||
|
source = sources[i]
|
||||||
|
|
||||||
|
prefix = g_prefix + "{}/".format(source_filenames[i])
|
||||||
|
concat(source, target, offsets, prefix, extraInfo)
|
||||||
|
|
||||||
|
extraInfo["num_total_meshes"] = offsets["meshes"]
|
||||||
|
extraInfo["num_total_buffers"] = offsets["buffers"]
|
||||||
|
extraInfo["num_total_bufferViews"] = offsets["bufferViews"]
|
||||||
|
extraInfo["num_total_accessors"] = offsets["accessors"]
|
||||||
|
extraInfo["num_total_materials"] = offsets["materials"]
|
||||||
|
|
||||||
target["asset"]["extras"] = extraInfo
|
target["asset"]["extras"] = extraInfo
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user