Last active
February 12, 2021 10:28
-
-
Save koduki/9abfea857d363d33ffcb698f38d1df5c to your computer and use it in GitHub Desktop.
バーチャルキャストのVCIをRubyで解析
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Read glTF | |
io = open('suika_vci.vci', "rb") | |
## Header | |
glb_h_magic = io.read(4) | |
glb_h_version = io.read(4).unpack("L*")[0] | |
glb_h_length = io.read(4).unpack("L*")[0] | |
### Chunk 0 (JSON) | |
glb_json_length = io.read(4).unpack("L*")[0] | |
glb_json_type = io.read(4) | |
glb_json_data = io.read(glb_json_length) | |
### Chunk 1 (Buffer) | |
glb_buff_length = io.read(4).unpack("L*")[0] | |
glb_buff_type = io.read(4) | |
glb_buff_data = io.read(glb_buff_length) | |
# Parse VCI | |
property = JSON.parse(glb_json_data) | |
generator = property["asset"]["generator"] | |
vci_meta = property["extensions"]["VCAST_vci_meta"].slice("title", "version", "authoer") | |
## Get images | |
img_idx = property["images"].find{|x| x["name"] == "suikaTex_out"}["bufferView"] | |
bfv = property["bufferViews"][img_idx] | |
img_data = glb_buff_data[bfv["byteOffset"], bfv["byteLength"]] | |
open('suikaTex_out.png', 'wb') do |f| | |
f.write(img_data.unpack('C*').pack('C*')) | |
end | |
img_idx = property["images"].find{|x| x["name"] == "suikaTex_in"}["bufferView"] | |
bfv = property["bufferViews"][img_idx] | |
img_data = glb_buff_data[bfv["byteOffset"], bfv["byteLength"]] | |
open('suikaTex_in.png', 'wb') do |f| | |
f.write(img_data.unpack('C*').pack('C*')) | |
end | |
## Get Lua Scripts | |
src_idx = property["extensions"]["VCAST_vci_embedded_script"]["scripts"][0]["source"] | |
bfv = property["bufferViews"][src_idx] | |
lua_script = glb_buff_data[bfv["byteOffset"], bfv["byteLength"]] | |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
GLB_H_MAGIC = "glTF".b | |
GLB_H_VERSION = [2].pack("L*") | |
GLB_JSON_TYPE = "JSON".b | |
GLB_BUFF_TYPE = "BIN\x00".b | |
FF = "\x00".b | |
# Load Template | |
io = open('WhiteBoard.vci') | |
glb_h_magic = io.read(4) | |
glb_h_version = io.read(4).unpack("L*")[0] | |
glb_h_length = io.read(4).unpack("L*")[0] | |
glb_json_length = io.read(4).unpack("L*")[0] | |
glb_json_type = io.read(4) | |
glb_json_data = io.read(glb_json_length);1 | |
glb_buff_length = io.read(4).unpack("L*")[0] | |
glb_buff_type = io.read(4) | |
glb_buff_data = io.read(glb_buff_length);1 | |
property=JSON.parse(glb_json_data) | |
# Create Data | |
image = open('testdata.png', 'rb').read;1 | |
data = image + FF + FF + FF;1 | |
property["bufferViews"].each_with_index do |x, i| | |
next if i==0 | |
data += glb_buff_data[x["byteOffset"], x["byteLength"]]; | |
# data += FF*4 if i==2 | |
# data += FF*8 if i==4 | |
end | |
data += FF;1 | |
# Create JSON | |
property["images"][0]["name"]="testdata" | |
property["bufferViews"][0]["byteLength"] = image.size | |
xs = property["bufferViews"] | |
(1..xs.size-1).each do |i| | |
x = xs[i - 1] | |
offset = x["byteOffset"] + x["byteLength"] | |
offset += 3 if i==1 | |
# offset += 4 if i==3 | |
# offset += 8 if i==5 | |
xs[i]["byteOffset"] = offset | |
end | |
property["buffers"][0]["byteLength"] = data.size | |
json = property.to_json.gsub('/', '\/') + " " | |
# Store GLTF | |
glb = GLB_H_MAGIC | |
glb += GLB_H_VERSION | |
glb += [json.size + data.size + 12 + 8 + 8].pack("L*") | |
glb += [json.size].pack("L*") | |
glb += GLB_JSON_TYPE | |
glb += json | |
glb += [data.size].pack("L*") | |
glb += GLB_BUFF_TYPE | |
glb += data;1 | |
open('output.vci', 'wb') do |f| | |
f.write(glb) | |
end |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"asset": { | |
"generator": "UniVCI-0.31", | |
"version": "2.0" | |
}, | |
"buffers": [ | |
{ | |
"byteLength": 100012 | |
} | |
], | |
"bufferViews": [ | |
{ | |
"buffer": 0, | |
"byteOffset": 0, | |
"byteLength": 21697 | |
}, | |
{ | |
"buffer": 0, | |
"byteOffset": 21697, | |
"byteLength": 4630 | |
}, | |
{ | |
"buffer": 0, | |
"byteOffset": 26328, | |
"byteLength": 3840, | |
"target": 34962 | |
}, | |
{ | |
"buffer": 0, | |
"byteOffset": 30168, | |
"byteLength": 3840, | |
"target": 34962 | |
}, | |
{ | |
"buffer": 0, | |
"byteOffset": 34008, | |
"byteLength": 2560, | |
"target": 34962 | |
}, | |
{ | |
"buffer": 0, | |
"byteOffset": 36568, | |
"byteLength": 5760, | |
"target": 34963 | |
}, | |
{ | |
"buffer": 0, | |
"byteOffset": 42328, | |
"byteLength": 384, | |
"target": 34963 | |
}, | |
{ | |
"buffer": 0, | |
"byteOffset": 42720, | |
"byteLength": 3900, | |
"target": 34962 | |
}, | |
{ | |
"buffer": 0, | |
"byteOffset": 46620, | |
"byteLength": 3900, | |
"target": 34962 | |
}, | |
{ | |
"buffer": 0, | |
"byteOffset": 50520, | |
"byteLength": 2600, | |
"target": 34962 | |
}, | |
{ | |
"buffer": 0, | |
"byteOffset": 53120, | |
"byteLength": 5760, | |
"target": 34963 | |
}, | |
{ | |
"buffer": 0, | |
"byteOffset": 58880, | |
"byteLength": 360, | |
"target": 34963 | |
}, | |
{ | |
"buffer": 0, | |
"byteOffset": 59244, | |
"byteLength": 2712, | |
"target": 34962 | |
}, | |
{ | |
"buffer": 0, | |
"byteOffset": 61956, | |
"byteLength": 2712, | |
"target": 34962 | |
}, | |
{ | |
"buffer": 0, | |
"byteOffset": 64668, | |
"byteLength": 4608, | |
"target": 34963 | |
}, | |
{ | |
"buffer": 0, | |
"byteOffset": 69276, | |
"byteLength": 6732, | |
"target": 34962 | |
}, | |
{ | |
"buffer": 0, | |
"byteOffset": 76008, | |
"byteLength": 6732, | |
"target": 34962 | |
}, | |
{ | |
"buffer": 0, | |
"byteOffset": 82744, | |
"byteLength": 4488, | |
"target": 34962 | |
}, | |
{ | |
"buffer": 0, | |
"byteOffset": 87232, | |
"byteLength": 11520, | |
"target": 34963 | |
}, | |
{ | |
"buffer": 0, | |
"byteOffset": 98752, | |
"byteLength": 1260 | |
} | |
], | |
"accessors": [ | |
{ | |
"bufferView": 2, | |
"byteOffset": 0, | |
"type": "VEC3", | |
"componentType": 5126, | |
"count": 320, | |
"max": [ | |
0.249999955, | |
0.5, | |
0.25000006 | |
], | |
"min": [ | |
-5.332548E-08, | |
0, | |
-0.25000006 | |
], | |
"normalized": false | |
}, | |
{ | |
"bufferView": 3, | |
"byteOffset": 0, | |
"type": "VEC3", | |
"componentType": 5126, | |
"count": 320, | |
"normalized": false | |
}, | |
{ | |
"bufferView": 4, | |
"byteOffset": 0, | |
"type": "VEC2", | |
"componentType": 5126, | |
"count": 320, | |
"normalized": false | |
}, | |
{ | |
"bufferView": 5, | |
"byteOffset": 0, | |
"type": "SCALAR", | |
"componentType": 5125, | |
"count": 1440, | |
"normalized": false | |
}, | |
{ | |
"bufferView": 6, | |
"byteOffset": 0, | |
"type": "SCALAR", | |
"componentType": 5125, | |
"count": 96, | |
"normalized": false | |
}, | |
{ | |
"bufferView": 7, | |
"byteOffset": 0, | |
"type": "VEC3", | |
"componentType": 5126, | |
"count": 325, | |
"max": [ | |
3.980678E-08, | |
0.5, | |
0.25000006 | |
], | |
"min": [ | |
-0.25000003, | |
0, | |
-0.25000006 | |
], | |
"normalized": false | |
}, | |
{ | |
"bufferView": 8, | |
"byteOffset": 0, | |
"type": "VEC3", | |
"componentType": 5126, | |
"count": 325, | |
"normalized": false | |
}, | |
{ | |
"bufferView": 9, | |
"byteOffset": 0, | |
"type": "VEC2", | |
"componentType": 5126, | |
"count": 325, | |
"normalized": false | |
}, | |
{ | |
"bufferView": 10, | |
"byteOffset": 0, | |
"type": "SCALAR", | |
"componentType": 5125, | |
"count": 1440, | |
"normalized": false | |
}, | |
{ | |
"bufferView": 11, | |
"byteOffset": 0, | |
"type": "SCALAR", | |
"componentType": 5125, | |
"count": 90, | |
"normalized": false | |
}, | |
{ | |
"bufferView": 12, | |
"byteOffset": 0, | |
"type": "VEC3", | |
"componentType": 5126, | |
"count": 226, | |
"max": [ | |
0.04094824, | |
0.8000002, | |
0.04094861 | |
], | |
"min": [ | |
-0.0409483574, | |
-1.39698442E-09, | |
-0.040948 | |
], | |
"normalized": false | |
}, | |
{ | |
"bufferView": 13, | |
"byteOffset": 0, | |
"type": "VEC3", | |
"componentType": 5126, | |
"count": 226, | |
"normalized": false | |
}, | |
{ | |
"bufferView": 14, | |
"byteOffset": 0, | |
"type": "SCALAR", | |
"componentType": 5125, | |
"count": 1152, | |
"normalized": false | |
}, | |
{ | |
"bufferView": 15, | |
"byteOffset": 0, | |
"type": "VEC3", | |
"componentType": 5126, | |
"count": 561, | |
"max": [ | |
0.249999955, | |
0.5, | |
0.25000006 | |
], | |
"min": [ | |
-0.25000003, | |
0, | |
-0.25000006 | |
], | |
"normalized": false | |
}, | |
{ | |
"bufferView": 16, | |
"byteOffset": 0, | |
"type": "VEC3", | |
"componentType": 5126, | |
"count": 561, | |
"normalized": false | |
}, | |
{ | |
"bufferView": 17, | |
"byteOffset": 0, | |
"type": "VEC2", | |
"componentType": 5126, | |
"count": 561, | |
"normalized": false | |
}, | |
{ | |
"bufferView": 18, | |
"byteOffset": 0, | |
"type": "SCALAR", | |
"componentType": 5125, | |
"count": 2880, | |
"normalized": false | |
} | |
], | |
"textures": [ | |
{ | |
"sampler": 0, | |
"source": 0 | |
}, | |
{ | |
"sampler": 1, | |
"source": 1 | |
} | |
], | |
"samplers": [ | |
{ | |
"magFilter": 9729, | |
"minFilter": 9729, | |
"wrapS": 10497, | |
"wrapT": 10497 | |
}, | |
{ | |
"magFilter": 9729, | |
"minFilter": 9729, | |
"wrapS": 10497, | |
"wrapT": 10497 | |
} | |
], | |
"images": [ | |
{ | |
"name": "suikaTex_out", | |
"bufferView": 0, | |
"mimeType": "image\/png" | |
}, | |
{ | |
"name": "suikaTex_in", | |
"bufferView": 1, | |
"mimeType": "image\/png" | |
} | |
], | |
"materials": [ | |
{ | |
"name": "Suika.001", | |
"pbrMetallicRoughness": { | |
"baseColorTexture": { | |
"index": 0, | |
"texCoord": 0, | |
"extensions": { | |
"KHR_texture_transform": { | |
"offset": [ | |
0, | |
0 | |
], | |
"rotation": 0, | |
"scale": [ | |
1, | |
1 | |
], | |
"texCoord": 0 | |
} | |
} | |
}, | |
"baseColorFactor": [ | |
0.6038274, | |
0.6038274, | |
0.6038274, | |
1 | |
], | |
"metallicFactor": 0, | |
"roughnessFactor": 1 | |
}, | |
"alphaMode": "OPAQUE", | |
"alphaCutoff": 0.5, | |
"doubleSided": false | |
}, | |
{ | |
"name": "Suika_naka", | |
"pbrMetallicRoughness": { | |
"baseColorTexture": { | |
"index": 1, | |
"texCoord": 0, | |
"extensions": { | |
"KHR_texture_transform": { | |
"offset": [ | |
0, | |
0 | |
], | |
"rotation": 0, | |
"scale": [ | |
1, | |
1 | |
], | |
"texCoord": 0 | |
} | |
} | |
}, | |
"baseColorFactor": [ | |
0.6038274, | |
0.6038274, | |
0.6038274, | |
1 | |
], | |
"metallicFactor": 0, | |
"roughnessFactor": 1 | |
}, | |
"alphaMode": "OPAQUE", | |
"alphaCutoff": 0.5, | |
"doubleSided": false | |
}, | |
{ | |
"name": "Suika.001", | |
"pbrMetallicRoughness": { | |
"baseColorTexture": { | |
"index": 0, | |
"texCoord": 0, | |
"extensions": { | |
"KHR_texture_transform": { | |
"offset": [ | |
0, | |
0 | |
], | |
"rotation": 0, | |
"scale": [ | |
1, | |
1 | |
], | |
"texCoord": 0 | |
} | |
} | |
}, | |
"baseColorFactor": [ | |
0.6038274, | |
0.6038274, | |
0.6038274, | |
1 | |
], | |
"metallicFactor": 0, | |
"roughnessFactor": 1 | |
}, | |
"alphaMode": "OPAQUE", | |
"alphaCutoff": 0.5, | |
"doubleSided": false | |
}, | |
{ | |
"name": "Suika_naka", | |
"pbrMetallicRoughness": { | |
"baseColorTexture": { | |
"index": 1, | |
"texCoord": 0, | |
"extensions": { | |
"KHR_texture_transform": { | |
"offset": [ | |
0, | |
0 | |
], | |
"rotation": 0, | |
"scale": [ | |
1, | |
1 | |
], | |
"texCoord": 0 | |
} | |
} | |
}, | |
"baseColorFactor": [ | |
0.6038274, | |
0.6038274, | |
0.6038274, | |
1 | |
], | |
"metallicFactor": 0, | |
"roughnessFactor": 1 | |
}, | |
"alphaMode": "OPAQUE", | |
"alphaCutoff": 0.5, | |
"doubleSided": false | |
}, | |
{ | |
"name": "suikabou", | |
"pbrMetallicRoughness": { | |
"baseColorFactor": [ | |
0.323017746, | |
0.0488309227, | |
0, | |
1 | |
], | |
"metallicFactor": 0, | |
"roughnessFactor": 1 | |
}, | |
"alphaMode": "OPAQUE", | |
"alphaCutoff": 0.5, | |
"doubleSided": false | |
}, | |
{ | |
"name": "Suika", | |
"pbrMetallicRoughness": { | |
"baseColorTexture": { | |
"index": 0, | |
"texCoord": 0, | |
"extensions": { | |
"KHR_texture_transform": { | |
"offset": [ | |
0, | |
0 | |
], | |
"rotation": 0, | |
"scale": [ | |
1, | |
1 | |
], | |
"texCoord": 0 | |
} | |
} | |
}, | |
"baseColorFactor": [ | |
0.6038274, | |
0.6038274, | |
0.6038274, | |
1 | |
], | |
"metallicFactor": 0, | |
"roughnessFactor": 1 | |
}, | |
"alphaMode": "OPAQUE", | |
"alphaCutoff": 0.5, | |
"doubleSided": false | |
} | |
], | |
"meshes": [ | |
{ | |
"name": "Suika_wareL", | |
"primitives": [ | |
{ | |
"mode": 4, | |
"indices": 3, | |
"attributes": { | |
"POSITION": 0, | |
"NORMAL": 1, | |
"TEXCOORD_0": 2 | |
}, | |
"material": 0 | |
}, | |
{ | |
"mode": 4, | |
"indices": 4, | |
"attributes": { | |
"POSITION": 0, | |
"NORMAL": 1, | |
"TEXCOORD_0": 2 | |
}, | |
"material": 1 | |
} | |
] | |
}, | |
{ | |
"name": "Suika_wareR", | |
"primitives": [ | |
{ | |
"mode": 4, | |
"indices": 8, | |
"attributes": { | |
"POSITION": 5, | |
"NORMAL": 6, | |
"TEXCOORD_0": 7 | |
}, | |
"material": 2 | |
}, | |
{ | |
"mode": 4, | |
"indices": 9, | |
"attributes": { | |
"POSITION": 5, | |
"NORMAL": 6, | |
"TEXCOORD_0": 7 | |
}, | |
"material": 3 | |
} | |
] | |
}, | |
{ | |
"name": "Cylinder", | |
"primitives": [ | |
{ | |
"mode": 4, | |
"indices": 12, | |
"attributes": { | |
"POSITION": 10, | |
"NORMAL": 11 | |
}, | |
"material": 4 | |
} | |
] | |
}, | |
{ | |
"name": "Suika", | |
"primitives": [ | |
{ | |
"mode": 4, | |
"indices": 16, | |
"attributes": { | |
"POSITION": 13, | |
"NORMAL": 14, | |
"TEXCOORD_0": 15 | |
}, | |
"material": 5 | |
} | |
] | |
} | |
], | |
"nodes": [ | |
{ | |
"name": "Suika_wareL", | |
"translation": [ | |
0, | |
-1, | |
0 | |
], | |
"rotation": [ | |
0, | |
0, | |
0, | |
1 | |
], | |
"scale": [ | |
1, | |
1, | |
1 | |
], | |
"mesh": 0, | |
"extensions": { | |
"VCAST_vci_collider": { | |
"colliders": [ | |
{ | |
"type": "box", | |
"layer": "default", | |
"center": [ | |
0.125, | |
0, | |
0 | |
], | |
"shape": [ | |
0.25, | |
0.5, | |
0.5000001 | |
], | |
"grabable": false, | |
"useGravity": false, | |
"isTrigger": false | |
} | |
] | |
}, | |
"VCAST_vci_rigidbody": { | |
"rigidbodies": [ | |
{ | |
"mass": 1, | |
"drag": 0, | |
"angularDrag": 0.05, | |
"useGravity": true, | |
"isKinematic": false, | |
"interpolate": "NONE", | |
"collisionDetection": "DISCRETE", | |
"freezePositionX": false, | |
"freezePositionY": false, | |
"freezePositionZ": false, | |
"freezeRotationX": false, | |
"freezeRotationY": false, | |
"freezeRotationZ": false | |
} | |
] | |
}, | |
"VCAST_vci_item": { | |
"grabbable": true, | |
"scalable": false, | |
"uniformScaling": false, | |
"attractable": false, | |
"groupId": 1 | |
} | |
}, | |
"extras": {} | |
}, | |
{ | |
"name": "Suika_wareR", | |
"translation": [ | |
0, | |
-1, | |
0 | |
], | |
"rotation": [ | |
0, | |
0, | |
0, | |
1 | |
], | |
"scale": [ | |
1, | |
1, | |
1 | |
], | |
"mesh": 1, | |
"extensions": { | |
"VCAST_vci_collider": { | |
"colliders": [ | |
{ | |
"type": "box", | |
"layer": "default", | |
"center": [ | |
-0.126, | |
0, | |
0 | |
], | |
"shape": [ | |
0.25000006, | |
0.5, | |
0.5000001 | |
], | |
"grabable": false, | |
"useGravity": false, | |
"isTrigger": false | |
} | |
] | |
}, | |
"VCAST_vci_rigidbody": { | |
"rigidbodies": [ | |
{ | |
"mass": 1, | |
"drag": 0, | |
"angularDrag": 0.05, | |
"useGravity": true, | |
"isKinematic": false, | |
"interpolate": "NONE", | |
"collisionDetection": "DISCRETE", | |
"freezePositionX": false, | |
"freezePositionY": false, | |
"freezePositionZ": false, | |
"freezeRotationX": false, | |
"freezeRotationY": false, | |
"freezeRotationZ": false | |
} | |
] | |
}, | |
"VCAST_vci_item": { | |
"grabbable": true, | |
"scalable": false, | |
"uniformScaling": false, | |
"attractable": false, | |
"groupId": 1 | |
} | |
}, | |
"extras": {} | |
}, | |
{ | |
"name": "suika_bou", | |
"translation": [ | |
0, | |
0.97, | |
0 | |
], | |
"rotation": [ | |
0, | |
0, | |
0, | |
1 | |
], | |
"scale": [ | |
1, | |
1, | |
1 | |
], | |
"mesh": 2, | |
"extensions": { | |
"VCAST_vci_collider": { | |
"colliders": [ | |
{ | |
"type": "capsule", | |
"layer": "default", | |
"center": [ | |
-5.96046448E-08, | |
0.4000001, | |
3.054738E-07 | |
], | |
"shape": [ | |
0.0409483053, | |
0.8000002, | |
1 | |
], | |
"grabable": false, | |
"useGravity": false, | |
"isTrigger": false | |
} | |
] | |
}, | |
"VCAST_vci_rigidbody": { | |
"rigidbodies": [ | |
{ | |
"mass": 1, | |
"drag": 0, | |
"angularDrag": 0.05, | |
"useGravity": false, | |
"isKinematic": true, | |
"interpolate": "NONE", | |
"collisionDetection": "DISCRETE", | |
"freezePositionX": false, | |
"freezePositionY": false, | |
"freezePositionZ": false, | |
"freezeRotationX": false, | |
"freezeRotationY": false, | |
"freezeRotationZ": false | |
} | |
] | |
}, | |
"VCAST_vci_item": { | |
"grabbable": true, | |
"scalable": true, | |
"uniformScaling": false, | |
"attractable": false, | |
"groupId": 1 | |
} | |
}, | |
"extras": {} | |
}, | |
{ | |
"name": "Suika", | |
"translation": [ | |
0, | |
0, | |
0 | |
], | |
"rotation": [ | |
0, | |
0, | |
0, | |
1 | |
], | |
"scale": [ | |
1, | |
1, | |
1 | |
], | |
"mesh": 3, | |
"extensions": { | |
"VCAST_vci_collider": { | |
"colliders": [ | |
{ | |
"type": "sphere", | |
"layer": "default", | |
"center": [ | |
-3.7252903E-08, | |
0.25, | |
0 | |
], | |
"shape": [ | |
0.25000006 | |
], | |
"grabable": false, | |
"useGravity": false, | |
"isTrigger": false | |
} | |
] | |
}, | |
"VCAST_vci_rigidbody": { | |
"rigidbodies": [ | |
{ | |
"mass": 1, | |
"drag": 0, | |
"angularDrag": 0.05, | |
"useGravity": true, | |
"isKinematic": false, | |
"interpolate": "NONE", | |
"collisionDetection": "DISCRETE", | |
"freezePositionX": false, | |
"freezePositionY": false, | |
"freezePositionZ": false, | |
"freezeRotationX": false, | |
"freezeRotationY": false, | |
"freezeRotationZ": false | |
} | |
] | |
}, | |
"VCAST_vci_item": { | |
"grabbable": true, | |
"scalable": true, | |
"uniformScaling": false, | |
"attractable": false, | |
"groupId": 1 | |
} | |
}, | |
"extras": {} | |
} | |
], | |
"scene": 0, | |
"scenes": [ | |
{ | |
"nodes": [ | |
0, | |
1, | |
2, | |
3 | |
] | |
} | |
], | |
"extensionsUsed": [ | |
"KHR_materials_unlit", | |
"KHR_texture_transform", | |
"VCAST_vci", | |
"VCAST_vci_animation", | |
"Effekseer", | |
"Effekseer_emitters", | |
"VCAST_vci_text", | |
"VCAST_vci_rectTransform", | |
"VCAST_vci_spring_bone", | |
"VCAST_vci_player_spawn_point", | |
"VCAST_vci_player_spawn_point_restriction", | |
"VCAST_vci_location_bounds", | |
"VCAST_vci_location_lighting", | |
"VCAST_vci_lightmap", | |
"VCAST_vci_reflectionProbe", | |
"VCAST_materials_pbr" | |
], | |
"extensions": { | |
"VCAST_vci_meta": { | |
"exporterVCIVersion": "UniVCI-0.31", | |
"specVersion": "0.31", | |
"title": "Suika VCI", | |
"version": "0.6", | |
"author": "koduki", | |
"contactInformation": "", | |
"reference": "", | |
"description": "", | |
"thumbnail": -1, | |
"modelDataLicenseType": "redistribution_prohibited", | |
"modelDataOtherLicenseUrl": "", | |
"scriptLicenseType": "redistribution_prohibited", | |
"scriptOtherLicenseUrl": "", | |
"scriptWriteProtected": false, | |
"scriptEnableDebugging": false, | |
"scriptFormat": "luaText" | |
}, | |
"VCAST_vci_embedded_script": { | |
"scripts": [ | |
{ | |
"name": "main", | |
"mimeType": "x_application_lua", | |
"targetEngine": "moonsharp", | |
"source": 19 | |
} | |
], | |
"entryPoint": 0 | |
}, | |
"VCAST_vci_material_unity": { | |
"materials": [ | |
{ | |
"name": "Suika.001", | |
"shader": "VRM_USE_GLTFSHADER", | |
"renderQueue": 2000, | |
"floatProperties": {}, | |
"vectorProperties": {}, | |
"textureProperties": {}, | |
"keywordMap": {}, | |
"tagMap": {} | |
}, | |
{ | |
"name": "Suika_naka", | |
"shader": "VRM_USE_GLTFSHADER", | |
"renderQueue": 2000, | |
"floatProperties": {}, | |
"vectorProperties": {}, | |
"textureProperties": {}, | |
"keywordMap": {}, | |
"tagMap": {} | |
}, | |
{ | |
"name": "Suika.001", | |
"shader": "VRM_USE_GLTFSHADER", | |
"renderQueue": 2000, | |
"floatProperties": {}, | |
"vectorProperties": {}, | |
"textureProperties": {}, | |
"keywordMap": {}, | |
"tagMap": {} | |
}, | |
{ | |
"name": "Suika_naka", | |
"shader": "VRM_USE_GLTFSHADER", | |
"renderQueue": 2000, | |
"floatProperties": {}, | |
"vectorProperties": {}, | |
"textureProperties": {}, | |
"keywordMap": {}, | |
"tagMap": {} | |
}, | |
{ | |
"name": "suikabou", | |
"shader": "VRM_USE_GLTFSHADER", | |
"renderQueue": 2000, | |
"floatProperties": {}, | |
"vectorProperties": {}, | |
"textureProperties": {}, | |
"keywordMap": {}, | |
"tagMap": {} | |
}, | |
{ | |
"name": "Suika", | |
"shader": "VRM_USE_GLTFSHADER", | |
"renderQueue": 2000, | |
"floatProperties": {}, | |
"vectorProperties": {}, | |
"textureProperties": {}, | |
"keywordMap": {}, | |
"tagMap": {} | |
} | |
] | |
} | |
}, | |
"extras": {} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
GLB_H_MAGIC = "glTF".b | |
GLB_H_VERSION = [2].pack("L*") | |
GLB_JSON_TYPE = "JSON".b | |
GLB_BUFF_TYPE = "BIN\x00".b | |
property=JSON.parse(glb_json_data) | |
property["asset"]["generator"]="ruby-vci:0.1123456" | |
json = property.to_json.gsub('/', '\/') + " " | |
data = glb_buff_data;1 | |
glb = GLB_H_MAGIC | |
glb += GLB_H_VERSION | |
glb += [json.size + data.size + 12 + 8 + 8].pack("L*") | |
glb += [json.size].pack("L*") | |
glb += GLB_JSON_TYPE | |
glb += json | |
glb += [data.size].pack("L*") | |
glb += GLB_BUFF_TYPE | |
glb += data;1 | |
open('output.vci', 'wb') do |f| | |
f.write(glb) | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment