mirror of
https://github.com/wader/fq.git
synced 2024-11-29 23:27:12 +03:00
1412 lines
64 KiB
Go
1412 lines
64 KiB
Go
package moc3
|
|
|
|
// https://github.com/OpenL2D/moc3ingbird/blob/master/src/moc3.hexpat
|
|
|
|
import (
|
|
"embed"
|
|
|
|
"github.com/wader/fq/format"
|
|
"github.com/wader/fq/pkg/decode"
|
|
"github.com/wader/fq/pkg/interp"
|
|
"github.com/wader/fq/pkg/scalar"
|
|
)
|
|
|
|
//go:embed moc3.md
|
|
var moc3FS embed.FS
|
|
|
|
func init() {
|
|
interp.RegisterFormat(
|
|
format.MOC3,
|
|
&decode.Format{
|
|
Description: "MOC3 file",
|
|
Groups: []*decode.Group{format.Probe},
|
|
DecodeFn: decodeMOC3,
|
|
})
|
|
interp.RegisterFS(moc3FS)
|
|
}
|
|
|
|
const (
|
|
moc3AlignBytes = 64
|
|
moc3AlignBits = moc3AlignBytes * 8
|
|
)
|
|
|
|
const (
|
|
moc3Version3_00_00 = 1
|
|
moc3Version3_03_00 = 2
|
|
moc3Version4_00_00 = 3
|
|
moc3Version4_02_00 = 4
|
|
moc3Version5_00_00 = 5
|
|
)
|
|
|
|
var boolNToSym = scalar.UintMapSymBool{
|
|
0: false,
|
|
1: true,
|
|
}
|
|
|
|
var moc3VersionNames = scalar.UintMap{
|
|
moc3Version3_00_00: {Sym: "V3_00_00", Description: "3.0.00 - 3.2.07"},
|
|
moc3Version3_03_00: {Sym: "V3_03_00", Description: "3.3.00 - 3.3.03"},
|
|
moc3Version4_00_00: {Sym: "V4_00_00", Description: "4.0.00 - 4.1.05"},
|
|
moc3Version4_02_00: {Sym: "V4_02_00", Description: "4.2.00 - 4.2.02"},
|
|
moc3Version5_00_00: {Sym: "V5_00_00", Description: "5.0.00"},
|
|
}
|
|
|
|
var deformerTypeNames = scalar.UintMapSymStr{
|
|
0: "warp",
|
|
1: "rotation",
|
|
}
|
|
|
|
var blendModeNames = scalar.UintMapSymStr{
|
|
0: "normal",
|
|
1: "additive",
|
|
2: "multiplicative",
|
|
}
|
|
|
|
var drawOrderGroupObjectTypeNames = scalar.UintMapSymStr{
|
|
0: "art_mesh",
|
|
1: "part",
|
|
}
|
|
|
|
var parameterTypeNames = scalar.UintMapSymStr{
|
|
0: "normal",
|
|
1: "blend_shape",
|
|
}
|
|
|
|
type countInfoTable struct {
|
|
parts int64
|
|
deformers int64
|
|
warpDeformers int64
|
|
rotationDeformers int64
|
|
artMeshes int64
|
|
parameters int64
|
|
partKeyforms int64
|
|
warpDeformerKeyforms int64
|
|
rotationDeformerKeyforms int64
|
|
artMeshKeyforms int64
|
|
keyformPositions int64
|
|
parameterBindingIndices int64
|
|
keyformBindings int64
|
|
parameterBindings int64
|
|
keys int64
|
|
uvs int64
|
|
positionIndices int64
|
|
drawableMasks int64
|
|
drawOrderGroups int64
|
|
drawOrderGroupObjects int64
|
|
glue int64
|
|
glueInfo int64
|
|
glueKeyforms int64
|
|
keyformMultiplyColors int64
|
|
keyformScreenColors int64
|
|
blendShapeParameterBindings int64
|
|
blendShapeKeyformBindings int64
|
|
blendShapesWarpDeformers int64
|
|
blendShapesArtMeshes int64
|
|
blendShapeConstraintIndices int64
|
|
blendShapeConstraints int64
|
|
blendShapeConstraintValues int64
|
|
blendShapesParts int64
|
|
blendShapesRotationDeformers int64
|
|
blendShapesGlue int64
|
|
}
|
|
|
|
type sectionOffsetTable struct {
|
|
countInfo int64
|
|
canvasInfo int64
|
|
|
|
parts struct {
|
|
runtimeSpace0 int64
|
|
ids int64
|
|
keyformBindingSourcesIndices int64
|
|
keyformSourcesBeginIndices int64
|
|
keyformSourcesCounts int64
|
|
isVisible int64
|
|
isEnabled int64
|
|
parentPartIndices int64
|
|
}
|
|
|
|
deformers struct {
|
|
runtimeSpace0 int64
|
|
ids int64
|
|
keyformBindingSourcesIndices int64
|
|
isVisible int64
|
|
isEnabled int64
|
|
parentPartIndices int64
|
|
parentDeformerIndices int64
|
|
types int64
|
|
specificSourcesIndices int64
|
|
}
|
|
|
|
warpDeformers struct {
|
|
keyformBindingSourcesIndices int64
|
|
keyformSourcesBeginIndices int64
|
|
keyformSourcesCounts int64
|
|
vertexCounts int64
|
|
rows int64
|
|
columns int64
|
|
}
|
|
|
|
rotationDeformers struct {
|
|
keyformBindingSourcesIndices int64
|
|
keyformSourcesBeginIndices int64
|
|
keyformSourcesCounts int64
|
|
baseAngles int64
|
|
}
|
|
|
|
artMeshes struct {
|
|
runtimeSpace0 int64
|
|
runtimeSpace1 int64
|
|
runtimeSpace2 int64
|
|
runtimeSpace3 int64
|
|
ids int64
|
|
keyformBindingSourcesIndices int64
|
|
keyformSourcesBeginIndices int64
|
|
keyformSourcesCounts int64
|
|
isVisible int64
|
|
isEnabled int64
|
|
parentPartIndices int64
|
|
parentDeformerIndices int64
|
|
textureNos int64
|
|
drawableFlags int64
|
|
vertexCounts int64
|
|
uvSourcesBeginIndices int64
|
|
positionIndexSourcesBeginIndices int64
|
|
positionIndexSourcesCounts int64
|
|
drawableMaskSourcesBeginIndices int64
|
|
drawableMaskSourcesCounts int64
|
|
}
|
|
|
|
parameters struct {
|
|
runtimeSpace0 int64
|
|
ids int64
|
|
maxValues int64
|
|
minValues int64
|
|
defaultValues int64
|
|
isRepeat int64
|
|
decimalPlaces int64
|
|
parameterBindingSourcesBeginIndices int64
|
|
parameterBindingSourcesCounts int64
|
|
}
|
|
|
|
partKeyforms struct {
|
|
drawOrders int64
|
|
}
|
|
|
|
warpDeformerKeyforms struct {
|
|
opacities int64
|
|
keyformPositionSourcesBeginIndices int64
|
|
}
|
|
|
|
rotationDeformerKeyforms struct {
|
|
opacities int64
|
|
angles int64
|
|
originX int64
|
|
originY int64
|
|
scales int64
|
|
isReflectX int64
|
|
isReflectY int64
|
|
}
|
|
|
|
artMeshKeyforms struct {
|
|
opacities int64
|
|
drawOrders int64
|
|
keyformPositionSourcesBeginIndices int64
|
|
}
|
|
|
|
keyformPositions struct {
|
|
xys int64
|
|
}
|
|
|
|
parameterBindingIndices struct {
|
|
bindingSourcesIndices int64
|
|
}
|
|
|
|
keyformBindings struct {
|
|
parameterBindingIndexSourcesBeginIndices int64
|
|
parameterBindingIndexSourcesCounts int64
|
|
}
|
|
|
|
parameterBindings struct {
|
|
keysSourcesBeginIndices int64
|
|
keysSourcesCounts int64
|
|
}
|
|
|
|
keys struct {
|
|
values int64
|
|
}
|
|
|
|
UVs struct {
|
|
uvs int64
|
|
}
|
|
|
|
positionIndices struct {
|
|
indices int64
|
|
}
|
|
|
|
drawableMasks struct {
|
|
artMeshSourcesIndices int64
|
|
}
|
|
|
|
drawOrderGroups struct {
|
|
objectSourcesBeginIndices int64
|
|
objectSourcesCounts int64
|
|
objectSourcesTotalCounts int64
|
|
maximumDrawOrders int64
|
|
minimumDrawOrders int64
|
|
}
|
|
|
|
drawOrderGroupObjects struct {
|
|
types int64
|
|
indices int64
|
|
selfIndices int64
|
|
}
|
|
|
|
glue struct {
|
|
runtimeSpace0 int64
|
|
ids int64
|
|
keyformBindingSourcesIndices int64
|
|
keyformSourcesBeginIndices int64
|
|
keyformSourcesCounts int64
|
|
artMeshIndicesA int64
|
|
artMeshIndicesB int64
|
|
glueInfoSourcesBeginIndices int64
|
|
glueInfoSourcesCounts int64
|
|
}
|
|
|
|
glueInfo struct {
|
|
weights int64
|
|
positionIndices int64
|
|
}
|
|
|
|
glueKeyforms struct {
|
|
intensities int64
|
|
}
|
|
|
|
warpDeformersV3_3 struct {
|
|
isQuadSource int64
|
|
}
|
|
|
|
parameterExtensions struct {
|
|
runtimeSpace0 int64
|
|
keysSourcesBeginIndices int64
|
|
keysSourcesCounts int64
|
|
}
|
|
|
|
warpDeformersV4_2 struct {
|
|
keyformColorSourcesBeginIndices int64
|
|
}
|
|
|
|
rotationDeformersV4_2 struct {
|
|
keyformColorSourcesBeginIndices int64
|
|
}
|
|
|
|
artMeshesV4_2 struct {
|
|
keyformColorSourcesBeginIndices int64
|
|
}
|
|
|
|
keyformMultiplyColors struct {
|
|
r int64
|
|
g int64
|
|
b int64
|
|
}
|
|
|
|
keyformScreenColors struct {
|
|
r int64
|
|
g int64
|
|
b int64
|
|
}
|
|
|
|
parametersV4_2 struct {
|
|
parameterTypes int64
|
|
blendShapeParameterBindingSourcesBeginIndices int64
|
|
blendShapeParameterBindingSourcesCounts int64
|
|
}
|
|
|
|
blendShapeParameterBindings struct {
|
|
keysSourcesBeginIndices int64
|
|
keysSourcesCounts int64
|
|
baseKeyIndices int64
|
|
}
|
|
|
|
blendShapeKeyformBindings struct {
|
|
parameterBindingSourcesIndices int64
|
|
keyformSourcesBlendShapeIndices int64
|
|
keyformSourcesBlendShapeCounts int64
|
|
blendShapeConstraintIndexSourcesBeginIndices int64
|
|
blendShapeConstraintIndexSourcesCounts int64
|
|
}
|
|
|
|
blendShapesWarpDeformers struct {
|
|
targetIndices int64
|
|
blendShapeKeyformBindingSourcesBeginIndices int64
|
|
blendShapeKeyformBindingSourcesCounts int64
|
|
}
|
|
|
|
blendShapesArtMeshes struct {
|
|
targetIndices int64
|
|
blendShapeKeyformBindingSourcesBeginIndices int64
|
|
blendShapeKeyformBindingSourcesCounts int64
|
|
}
|
|
|
|
blendShapeConstraintIndices struct {
|
|
blendShapeConstraintSourcesIndices int64
|
|
}
|
|
|
|
blendShapeConstraints struct {
|
|
parameterIndices int64
|
|
blendShapeConstraintValueSourcesBeginIndices int64
|
|
blendShapeConstraintValueSourcesCounts int64
|
|
}
|
|
|
|
blendShapeConstraintValues struct {
|
|
keys int64
|
|
weights int64
|
|
}
|
|
|
|
warpDeformerKeyformsV5_0 struct {
|
|
keyformMultiplyColorSourcesBeginIndices int64
|
|
keyformScreenColorSourcesBeginIndices int64
|
|
}
|
|
|
|
rotationDeformerKeyformsV5_0 struct {
|
|
keyformMultiplyColorSourcesBeginIndices int64
|
|
keyformScreenColorSourcesBeginIndices int64
|
|
}
|
|
|
|
artMeshKeyformsV5_0 struct {
|
|
keyformMultiplyColorSourcesBeginIndices int64
|
|
keyformScreenColorSourcesBeginIndices int64
|
|
}
|
|
|
|
blendShapesParts struct {
|
|
targetIndices int64
|
|
blendShapeKeyformBindingSourcesBeginIndices int64
|
|
blendShapeKeyformBindingSourcesCounts int64
|
|
}
|
|
|
|
blendShapesRotationDeformers struct {
|
|
targetIndices int64
|
|
blendShapeKeyformBindingSourcesBeginIndices int64
|
|
blendShapeKeyformBindingSourcesCounts int64
|
|
}
|
|
|
|
blendShapesGlue struct {
|
|
targetIndices int64
|
|
blendShapeKeyformBindingSourcesBeginIndices int64
|
|
blendShapeKeyformBindingSourcesCounts int64
|
|
}
|
|
}
|
|
|
|
func decodeMOC3(d *decode.D) any {
|
|
fieldAlignedNArray := func(d *decode.D, name string, n int64, fn func(d *decode.D)) {
|
|
d.FieldStruct(name, func(d *decode.D) {
|
|
d.FieldArray("array", func(d *decode.D) {
|
|
for i := int64(0); i < n; i++ {
|
|
fn(d)
|
|
}
|
|
})
|
|
|
|
var padding int64
|
|
if n != 0 {
|
|
padding = int64(d.AlignBits(moc3AlignBits))
|
|
}
|
|
d.FieldRawLen("padding", padding)
|
|
})
|
|
}
|
|
|
|
fieldRuntimeSpace := func(d *decode.D, name string, n int64, pad bool) {
|
|
paddedSize := n * 64
|
|
if pad && paddedSize%moc3AlignBits != 0 {
|
|
paddedSize = (paddedSize + moc3AlignBits) / moc3AlignBits * moc3AlignBits
|
|
}
|
|
|
|
d.FieldRawLen(name, paddedSize)
|
|
}
|
|
|
|
d.FieldUTF8("magic", 4, d.StrAssert("MOC3"))
|
|
version := d.FieldU8("version", moc3VersionNames)
|
|
isBigEndian := d.FieldU8("is_big_endian", boolNToSym) != 0
|
|
|
|
if !isBigEndian {
|
|
d.Endian = decode.LittleEndian
|
|
}
|
|
d.FieldRawLen("unused0", 58*8)
|
|
|
|
var sectionOffsets sectionOffsetTable
|
|
d.FramedFn(0x280*8, func(d *decode.D) {
|
|
d.FieldStruct("section_offsets", func(d *decode.D) {
|
|
sectionOffsets.countInfo = int64(d.FieldU32("count_info", scalar.UintHex))
|
|
sectionOffsets.canvasInfo = int64(d.FieldU32("canvas_info", scalar.UintHex))
|
|
|
|
d.FieldStruct("parts", func(d *decode.D) {
|
|
sectionOffsets.parts.runtimeSpace0 = int64(d.FieldU32("runtime_space0", scalar.UintHex))
|
|
sectionOffsets.parts.ids = int64(d.FieldU32("ids", scalar.UintHex))
|
|
sectionOffsets.parts.keyformBindingSourcesIndices = int64(d.FieldU32("keyform_binding_sources_indices", scalar.UintHex))
|
|
sectionOffsets.parts.keyformSourcesBeginIndices = int64(d.FieldU32("keyform_sources_begin_indices", scalar.UintHex))
|
|
sectionOffsets.parts.keyformSourcesCounts = int64(d.FieldU32("keyform_sources_counts", scalar.UintHex))
|
|
sectionOffsets.parts.isVisible = int64(d.FieldU32("is_visible", scalar.UintHex))
|
|
sectionOffsets.parts.isEnabled = int64(d.FieldU32("is_enabled", scalar.UintHex))
|
|
sectionOffsets.parts.parentPartIndices = int64(d.FieldU32("parent_part_indices", scalar.UintHex))
|
|
})
|
|
|
|
d.FieldStruct("deformers", func(d *decode.D) {
|
|
sectionOffsets.deformers.runtimeSpace0 = int64(d.FieldU32("runtime_space0", scalar.UintHex))
|
|
sectionOffsets.deformers.ids = int64(d.FieldU32("ids", scalar.UintHex))
|
|
sectionOffsets.deformers.keyformBindingSourcesIndices = int64(d.FieldU32("keyform_binding_sources_indices", scalar.UintHex))
|
|
sectionOffsets.deformers.isVisible = int64(d.FieldU32("is_visible", scalar.UintHex))
|
|
sectionOffsets.deformers.isEnabled = int64(d.FieldU32("is_enabled", scalar.UintHex))
|
|
sectionOffsets.deformers.parentPartIndices = int64(d.FieldU32("parent_part_indices", scalar.UintHex))
|
|
sectionOffsets.deformers.parentDeformerIndices = int64(d.FieldU32("parent_deformer_indices", scalar.UintHex))
|
|
sectionOffsets.deformers.types = int64(d.FieldU32("types", scalar.UintHex))
|
|
sectionOffsets.deformers.specificSourcesIndices = int64(d.FieldU32("specific_sources_indices", scalar.UintHex))
|
|
})
|
|
|
|
d.FieldStruct("warp_deformers", func(d *decode.D) {
|
|
sectionOffsets.warpDeformers.keyformBindingSourcesIndices = int64(d.FieldU32("keyform_binding_sources_indices", scalar.UintHex))
|
|
sectionOffsets.warpDeformers.keyformSourcesBeginIndices = int64(d.FieldU32("keyform_sources_begin_indices", scalar.UintHex))
|
|
sectionOffsets.warpDeformers.keyformSourcesCounts = int64(d.FieldU32("keyform_sources_counts", scalar.UintHex))
|
|
sectionOffsets.warpDeformers.vertexCounts = int64(d.FieldU32("vertex_counts", scalar.UintHex))
|
|
sectionOffsets.warpDeformers.rows = int64(d.FieldU32("rows", scalar.UintHex))
|
|
sectionOffsets.warpDeformers.columns = int64(d.FieldU32("columns", scalar.UintHex))
|
|
})
|
|
|
|
d.FieldStruct("rotation_deformers", func(d *decode.D) {
|
|
sectionOffsets.rotationDeformers.keyformBindingSourcesIndices = int64(d.FieldU32("keyform_binding_sources_indices", scalar.UintHex))
|
|
sectionOffsets.rotationDeformers.keyformSourcesBeginIndices = int64(d.FieldU32("keyform_sources_begin_indices", scalar.UintHex))
|
|
sectionOffsets.rotationDeformers.keyformSourcesCounts = int64(d.FieldU32("keyform_sources_counts", scalar.UintHex))
|
|
sectionOffsets.rotationDeformers.baseAngles = int64(d.FieldU32("base_angles", scalar.UintHex))
|
|
})
|
|
|
|
d.FieldStruct("art_meshes", func(d *decode.D) {
|
|
sectionOffsets.artMeshes.runtimeSpace0 = int64(d.FieldU32("runtime_space0", scalar.UintHex))
|
|
sectionOffsets.artMeshes.runtimeSpace1 = int64(d.FieldU32("runtime_space1", scalar.UintHex))
|
|
sectionOffsets.artMeshes.runtimeSpace2 = int64(d.FieldU32("runtime_space2", scalar.UintHex))
|
|
sectionOffsets.artMeshes.runtimeSpace3 = int64(d.FieldU32("runtime_space3", scalar.UintHex))
|
|
sectionOffsets.artMeshes.ids = int64(d.FieldU32("ids", scalar.UintHex))
|
|
sectionOffsets.artMeshes.keyformBindingSourcesIndices = int64(d.FieldU32("keyform_binding_sources_indices", scalar.UintHex))
|
|
sectionOffsets.artMeshes.keyformSourcesBeginIndices = int64(d.FieldU32("keyform_sources_begin_indices", scalar.UintHex))
|
|
sectionOffsets.artMeshes.keyformSourcesCounts = int64(d.FieldU32("keyform_sources_counts", scalar.UintHex))
|
|
sectionOffsets.artMeshes.isVisible = int64(d.FieldU32("is_visible", scalar.UintHex))
|
|
sectionOffsets.artMeshes.isEnabled = int64(d.FieldU32("is_enabled", scalar.UintHex))
|
|
sectionOffsets.artMeshes.parentPartIndices = int64(d.FieldU32("parent_part_indices", scalar.UintHex))
|
|
sectionOffsets.artMeshes.parentDeformerIndices = int64(d.FieldU32("parent_deformer_indices", scalar.UintHex))
|
|
sectionOffsets.artMeshes.textureNos = int64(d.FieldU32("texture_nos", scalar.UintHex))
|
|
sectionOffsets.artMeshes.drawableFlags = int64(d.FieldU32("drawable_flags", scalar.UintHex))
|
|
sectionOffsets.artMeshes.vertexCounts = int64(d.FieldU32("vertex_counts", scalar.UintHex))
|
|
sectionOffsets.artMeshes.uvSourcesBeginIndices = int64(d.FieldU32("uv_sources_begin_indices", scalar.UintHex))
|
|
sectionOffsets.artMeshes.positionIndexSourcesBeginIndices = int64(d.FieldU32("position_index_sources_begin_indices", scalar.UintHex))
|
|
sectionOffsets.artMeshes.positionIndexSourcesCounts = int64(d.FieldU32("position_index_sources_counts", scalar.UintHex))
|
|
sectionOffsets.artMeshes.drawableMaskSourcesBeginIndices = int64(d.FieldU32("drawable_mask_sources_begin_indices", scalar.UintHex))
|
|
sectionOffsets.artMeshes.drawableMaskSourcesCounts = int64(d.FieldU32("drawable_mask_sources_counts", scalar.UintHex))
|
|
})
|
|
|
|
d.FieldStruct("parameters", func(d *decode.D) {
|
|
sectionOffsets.parameters.runtimeSpace0 = int64(d.FieldU32("runtime_space0", scalar.UintHex))
|
|
sectionOffsets.parameters.ids = int64(d.FieldU32("ids", scalar.UintHex))
|
|
sectionOffsets.parameters.maxValues = int64(d.FieldU32("max_values", scalar.UintHex))
|
|
sectionOffsets.parameters.minValues = int64(d.FieldU32("min_values", scalar.UintHex))
|
|
sectionOffsets.parameters.defaultValues = int64(d.FieldU32("default_values", scalar.UintHex))
|
|
sectionOffsets.parameters.isRepeat = int64(d.FieldU32("is_repeat", scalar.UintHex))
|
|
sectionOffsets.parameters.decimalPlaces = int64(d.FieldU32("decimal_places", scalar.UintHex))
|
|
sectionOffsets.parameters.parameterBindingSourcesBeginIndices = int64(d.FieldU32("parameter_binding_sources_begin_indices", scalar.UintHex))
|
|
sectionOffsets.parameters.parameterBindingSourcesCounts = int64(d.FieldU32("parameter_binding_sources_counts", scalar.UintHex))
|
|
})
|
|
|
|
d.FieldStruct("part_keyforms", func(d *decode.D) {
|
|
sectionOffsets.partKeyforms.drawOrders = int64(d.FieldU32("draw_orders", scalar.UintHex))
|
|
})
|
|
|
|
d.FieldStruct("warp_deformer_keyforms", func(d *decode.D) {
|
|
sectionOffsets.warpDeformerKeyforms.opacities = int64(d.FieldU32("opacities", scalar.UintHex))
|
|
sectionOffsets.warpDeformerKeyforms.keyformPositionSourcesBeginIndices = int64(d.FieldU32("keyform_position_sources_begin_indices", scalar.UintHex))
|
|
})
|
|
|
|
d.FieldStruct("rotation_deformer_keyforms", func(d *decode.D) {
|
|
sectionOffsets.rotationDeformerKeyforms.opacities = int64(d.FieldU32("opacities", scalar.UintHex))
|
|
sectionOffsets.rotationDeformerKeyforms.angles = int64(d.FieldU32("angles", scalar.UintHex))
|
|
sectionOffsets.rotationDeformerKeyforms.originX = int64(d.FieldU32("origin_x", scalar.UintHex))
|
|
sectionOffsets.rotationDeformerKeyforms.originY = int64(d.FieldU32("origin_y", scalar.UintHex))
|
|
sectionOffsets.rotationDeformerKeyforms.scales = int64(d.FieldU32("scales", scalar.UintHex))
|
|
sectionOffsets.rotationDeformerKeyforms.isReflectX = int64(d.FieldU32("is_reflect_x", scalar.UintHex))
|
|
sectionOffsets.rotationDeformerKeyforms.isReflectY = int64(d.FieldU32("is_reflect_y", scalar.UintHex))
|
|
})
|
|
|
|
d.FieldStruct("art_mesh_keyforms", func(d *decode.D) {
|
|
sectionOffsets.artMeshKeyforms.opacities = int64(d.FieldU32("opacities", scalar.UintHex))
|
|
sectionOffsets.artMeshKeyforms.drawOrders = int64(d.FieldU32("draw_orders", scalar.UintHex))
|
|
sectionOffsets.artMeshKeyforms.keyformPositionSourcesBeginIndices = int64(d.FieldU32("keyform_position_sources_begin_indices", scalar.UintHex))
|
|
})
|
|
|
|
d.FieldStruct("keyform_positions", func(d *decode.D) {
|
|
sectionOffsets.keyformPositions.xys = int64(d.FieldU32("xys", scalar.UintHex))
|
|
})
|
|
|
|
d.FieldStruct("parameter_binding_indices", func(d *decode.D) {
|
|
sectionOffsets.parameterBindingIndices.bindingSourcesIndices = int64(d.FieldU32("binding_sources_indices", scalar.UintHex))
|
|
})
|
|
|
|
d.FieldStruct("keyform_bindings", func(d *decode.D) {
|
|
sectionOffsets.keyformBindings.parameterBindingIndexSourcesBeginIndices = int64(d.FieldU32("parameter_binding_index_sources_begin_indices", scalar.UintHex))
|
|
sectionOffsets.keyformBindings.parameterBindingIndexSourcesCounts = int64(d.FieldU32("parameter_binding_index_sources_counts", scalar.UintHex))
|
|
})
|
|
|
|
d.FieldStruct("parameter_bindings", func(d *decode.D) {
|
|
sectionOffsets.parameterBindings.keysSourcesBeginIndices = int64(d.FieldU32("keys_sources_begin_indices", scalar.UintHex))
|
|
sectionOffsets.parameterBindings.keysSourcesCounts = int64(d.FieldU32("keys_sources_counts", scalar.UintHex))
|
|
})
|
|
|
|
d.FieldStruct("keys", func(d *decode.D) {
|
|
sectionOffsets.keys.values = int64(d.FieldU32("values", scalar.UintHex))
|
|
})
|
|
|
|
d.FieldStruct("uvs", func(d *decode.D) {
|
|
sectionOffsets.UVs.uvs = int64(d.FieldU32("uvs", scalar.UintHex))
|
|
})
|
|
|
|
d.FieldStruct("position_indices", func(d *decode.D) {
|
|
sectionOffsets.positionIndices.indices = int64(d.FieldU32("indices", scalar.UintHex))
|
|
})
|
|
|
|
d.FieldStruct("drawable_masks", func(d *decode.D) {
|
|
sectionOffsets.drawableMasks.artMeshSourcesIndices = int64(d.FieldU32("art_mesh_sources_indices", scalar.UintHex))
|
|
})
|
|
|
|
d.FieldStruct("draw_order_groups", func(d *decode.D) {
|
|
sectionOffsets.drawOrderGroups.objectSourcesBeginIndices = int64(d.FieldU32("object_sources_begin_indices", scalar.UintHex))
|
|
sectionOffsets.drawOrderGroups.objectSourcesCounts = int64(d.FieldU32("object_sources_counts", scalar.UintHex))
|
|
sectionOffsets.drawOrderGroups.objectSourcesTotalCounts = int64(d.FieldU32("object_sources_total_counts", scalar.UintHex))
|
|
sectionOffsets.drawOrderGroups.maximumDrawOrders = int64(d.FieldU32("maximum_draw_orders", scalar.UintHex))
|
|
sectionOffsets.drawOrderGroups.minimumDrawOrders = int64(d.FieldU32("minimum_draw_orders", scalar.UintHex))
|
|
})
|
|
|
|
d.FieldStruct("draw_order_group_objects", func(d *decode.D) {
|
|
sectionOffsets.drawOrderGroupObjects.types = int64(d.FieldU32("types", scalar.UintHex))
|
|
sectionOffsets.drawOrderGroupObjects.indices = int64(d.FieldU32("indices", scalar.UintHex))
|
|
sectionOffsets.drawOrderGroupObjects.selfIndices = int64(d.FieldU32("self_indices", scalar.UintHex))
|
|
})
|
|
|
|
d.FieldStruct("glue", func(d *decode.D) {
|
|
sectionOffsets.glue.runtimeSpace0 = int64(d.FieldU32("runtime_space0", scalar.UintHex))
|
|
sectionOffsets.glue.ids = int64(d.FieldU32("ids", scalar.UintHex))
|
|
sectionOffsets.glue.keyformBindingSourcesIndices = int64(d.FieldU32("keyform_binding_sources_indices", scalar.UintHex))
|
|
sectionOffsets.glue.keyformSourcesBeginIndices = int64(d.FieldU32("keyform_sources_begin_indices", scalar.UintHex))
|
|
sectionOffsets.glue.keyformSourcesCounts = int64(d.FieldU32("keyform_sources_counts", scalar.UintHex))
|
|
sectionOffsets.glue.artMeshIndicesA = int64(d.FieldU32("art_mesh_indices_a", scalar.UintHex))
|
|
sectionOffsets.glue.artMeshIndicesB = int64(d.FieldU32("art_mesh_indices_b", scalar.UintHex))
|
|
sectionOffsets.glue.glueInfoSourcesBeginIndices = int64(d.FieldU32("glue_info_sources_begin_indices", scalar.UintHex))
|
|
sectionOffsets.glue.glueInfoSourcesCounts = int64(d.FieldU32("glue_info_sources_counts", scalar.UintHex))
|
|
})
|
|
|
|
d.FieldStruct("glue_info", func(d *decode.D) {
|
|
sectionOffsets.glueInfo.weights = int64(d.FieldU32("weights", scalar.UintHex))
|
|
sectionOffsets.glueInfo.positionIndices = int64(d.FieldU32("position_indices", scalar.UintHex))
|
|
})
|
|
|
|
d.FieldStruct("glue_keyforms", func(d *decode.D) {
|
|
sectionOffsets.glueKeyforms.intensities = int64(d.FieldU32("intensities", scalar.UintHex))
|
|
})
|
|
|
|
if version >= moc3Version3_03_00 {
|
|
d.FieldStruct("warp_deformers_v3_3", func(d *decode.D) {
|
|
sectionOffsets.warpDeformersV3_3.isQuadSource = int64(d.FieldU32("is_quad_source", scalar.UintHex))
|
|
})
|
|
}
|
|
|
|
if version >= moc3Version4_02_00 {
|
|
d.FieldStruct("parameter_extensions", func(d *decode.D) {
|
|
sectionOffsets.parameterExtensions.runtimeSpace0 = int64(d.FieldU32("runtime_space0", scalar.UintHex))
|
|
sectionOffsets.parameterExtensions.keysSourcesBeginIndices = int64(d.FieldU32("keys_sources_begin_indices", scalar.UintHex))
|
|
sectionOffsets.parameterExtensions.keysSourcesCounts = int64(d.FieldU32("keys_sources_counts", scalar.UintHex))
|
|
})
|
|
|
|
d.FieldStruct("warp_deformers_v4_2", func(d *decode.D) {
|
|
sectionOffsets.warpDeformersV4_2.keyformColorSourcesBeginIndices = int64(d.FieldU32("keyform_color_sources_begin_indices", scalar.UintHex))
|
|
})
|
|
|
|
d.FieldStruct("rotation_deformers_v4_2", func(d *decode.D) {
|
|
sectionOffsets.rotationDeformersV4_2.keyformColorSourcesBeginIndices = int64(d.FieldU32("keyform_color_sources_begin_indices", scalar.UintHex))
|
|
})
|
|
|
|
d.FieldStruct("art_meshes_v4_2", func(d *decode.D) {
|
|
sectionOffsets.artMeshesV4_2.keyformColorSourcesBeginIndices = int64(d.FieldU32("keyform_color_sources_begin_indices", scalar.UintHex))
|
|
})
|
|
|
|
d.FieldStruct("keyform_multiply_colors", func(d *decode.D) {
|
|
sectionOffsets.keyformMultiplyColors.r = int64(d.FieldU32("r", scalar.UintHex))
|
|
sectionOffsets.keyformMultiplyColors.g = int64(d.FieldU32("g", scalar.UintHex))
|
|
sectionOffsets.keyformMultiplyColors.b = int64(d.FieldU32("b", scalar.UintHex))
|
|
})
|
|
|
|
d.FieldStruct("keyform_screen_colors", func(d *decode.D) {
|
|
sectionOffsets.keyformScreenColors.r = int64(d.FieldU32("r", scalar.UintHex))
|
|
sectionOffsets.keyformScreenColors.g = int64(d.FieldU32("g", scalar.UintHex))
|
|
sectionOffsets.keyformScreenColors.b = int64(d.FieldU32("b", scalar.UintHex))
|
|
})
|
|
|
|
d.FieldStruct("parameters_v4_2", func(d *decode.D) {
|
|
sectionOffsets.parametersV4_2.parameterTypes = int64(d.FieldU32("parameter_types", scalar.UintHex))
|
|
sectionOffsets.parametersV4_2.blendShapeParameterBindingSourcesBeginIndices = int64(d.FieldU32("blend_shape_parameter_binding_sources_begin_indices", scalar.UintHex))
|
|
sectionOffsets.parametersV4_2.blendShapeParameterBindingSourcesCounts = int64(d.FieldU32("blend_shape_parameter_binding_sources_counts", scalar.UintHex))
|
|
})
|
|
|
|
d.FieldStruct("blend_shape_parameter_bindings", func(d *decode.D) {
|
|
sectionOffsets.blendShapeParameterBindings.keysSourcesBeginIndices = int64(d.FieldU32("keys_sources_begin_indices", scalar.UintHex))
|
|
sectionOffsets.blendShapeParameterBindings.keysSourcesCounts = int64(d.FieldU32("keys_sources_counts", scalar.UintHex))
|
|
sectionOffsets.blendShapeParameterBindings.baseKeyIndices = int64(d.FieldU32("base_key_indices", scalar.UintHex))
|
|
})
|
|
|
|
d.FieldStruct("blend_shape_keyform_bindings", func(d *decode.D) {
|
|
sectionOffsets.blendShapeKeyformBindings.parameterBindingSourcesIndices = int64(d.FieldU32("parameter_binding_sources_indices", scalar.UintHex))
|
|
sectionOffsets.blendShapeKeyformBindings.keyformSourcesBlendShapeIndices = int64(d.FieldU32("keyform_sources_blend_shape_indices", scalar.UintHex))
|
|
sectionOffsets.blendShapeKeyformBindings.keyformSourcesBlendShapeCounts = int64(d.FieldU32("keyform_sources_blend_shape_counts", scalar.UintHex))
|
|
sectionOffsets.blendShapeKeyformBindings.blendShapeConstraintIndexSourcesBeginIndices = int64(d.FieldU32("blend_shape_constraint_index_sources_begin_indices", scalar.UintHex))
|
|
sectionOffsets.blendShapeKeyformBindings.blendShapeConstraintIndexSourcesCounts = int64(d.FieldU32("blend_shape_constraint_index_sources_counts", scalar.UintHex))
|
|
})
|
|
|
|
d.FieldStruct("blend_shapes_warp_deformers", func(d *decode.D) {
|
|
sectionOffsets.blendShapesWarpDeformers.targetIndices = int64(d.FieldU32("target_indices", scalar.UintHex))
|
|
sectionOffsets.blendShapesWarpDeformers.blendShapeKeyformBindingSourcesBeginIndices = int64(d.FieldU32("blend_shape_keyform_binding_sources_begin_indices", scalar.UintHex))
|
|
sectionOffsets.blendShapesWarpDeformers.blendShapeKeyformBindingSourcesCounts = int64(d.FieldU32("blend_shape_keyform_binding_sources_counts", scalar.UintHex))
|
|
})
|
|
|
|
d.FieldStruct("blend_shapes_art_meshes", func(d *decode.D) {
|
|
sectionOffsets.blendShapesArtMeshes.targetIndices = int64(d.FieldU32("target_indices", scalar.UintHex))
|
|
sectionOffsets.blendShapesArtMeshes.blendShapeKeyformBindingSourcesBeginIndices = int64(d.FieldU32("blend_shape_keyform_binding_sources_begin_indices", scalar.UintHex))
|
|
sectionOffsets.blendShapesArtMeshes.blendShapeKeyformBindingSourcesCounts = int64(d.FieldU32("blend_shape_keyform_binding_sources_counts", scalar.UintHex))
|
|
})
|
|
|
|
d.FieldStruct("blend_shape_constraint_indices", func(d *decode.D) {
|
|
sectionOffsets.blendShapeConstraintIndices.blendShapeConstraintSourcesIndices = int64(d.FieldU32("blend_shape_constraint_sources_indices", scalar.UintHex))
|
|
})
|
|
|
|
d.FieldStruct("blend_shape_constraints", func(d *decode.D) {
|
|
sectionOffsets.blendShapeConstraints.parameterIndices = int64(d.FieldU32("parameter_indices", scalar.UintHex))
|
|
sectionOffsets.blendShapeConstraints.blendShapeConstraintValueSourcesBeginIndices = int64(d.FieldU32("blend_shape_constraint_value_sources_begin_indices", scalar.UintHex))
|
|
sectionOffsets.blendShapeConstraints.blendShapeConstraintValueSourcesCounts = int64(d.FieldU32("blend_shape_constraint_value_sources_counts", scalar.UintHex))
|
|
})
|
|
|
|
d.FieldStruct("blend_shape_constraint_values", func(d *decode.D) {
|
|
sectionOffsets.blendShapeConstraintValues.keys = int64(d.FieldU32("keys", scalar.UintHex))
|
|
sectionOffsets.blendShapeConstraintValues.weights = int64(d.FieldU32("weights", scalar.UintHex))
|
|
})
|
|
}
|
|
|
|
if version >= moc3Version5_00_00 {
|
|
d.FieldStruct("warp_deformer_keyforms_v5_0", func(d *decode.D) {
|
|
sectionOffsets.warpDeformerKeyformsV5_0.keyformMultiplyColorSourcesBeginIndices = int64(d.FieldU32("keyform_multiply_color_sources_begin_indices", scalar.UintHex))
|
|
sectionOffsets.warpDeformerKeyformsV5_0.keyformScreenColorSourcesBeginIndices = int64(d.FieldU32("keyform_screen_color_sources_begin_indices", scalar.UintHex))
|
|
})
|
|
|
|
d.FieldStruct("rotation_deformer_keyforms_v5_0", func(d *decode.D) {
|
|
sectionOffsets.rotationDeformerKeyformsV5_0.keyformMultiplyColorSourcesBeginIndices = int64(d.FieldU32("keyform_multiply_color_sources_begin_indices", scalar.UintHex))
|
|
sectionOffsets.rotationDeformerKeyformsV5_0.keyformScreenColorSourcesBeginIndices = int64(d.FieldU32("keyform_screen_color_sources_begin_indices", scalar.UintHex))
|
|
})
|
|
|
|
d.FieldStruct("art_mesh_keyforms_v5_0", func(d *decode.D) {
|
|
sectionOffsets.artMeshKeyformsV5_0.keyformMultiplyColorSourcesBeginIndices = int64(d.FieldU32("keyform_multiply_color_sources_begin_indices", scalar.UintHex))
|
|
sectionOffsets.artMeshKeyformsV5_0.keyformScreenColorSourcesBeginIndices = int64(d.FieldU32("keyform_screen_color_sources_begin_indices", scalar.UintHex))
|
|
})
|
|
|
|
d.FieldStruct("blend_shapes_parts", func(d *decode.D) {
|
|
sectionOffsets.blendShapesParts.targetIndices = int64(d.FieldU32("target_indices", scalar.UintHex))
|
|
sectionOffsets.blendShapesParts.blendShapeKeyformBindingSourcesBeginIndices = int64(d.FieldU32("blend_shape_keyform_binding_sources_begin_indices", scalar.UintHex))
|
|
sectionOffsets.blendShapesParts.blendShapeKeyformBindingSourcesCounts = int64(d.FieldU32("blend_shape_keyform_binding_sources_counts", scalar.UintHex))
|
|
})
|
|
|
|
d.FieldStruct("blend_shapes_rotation_deformers", func(d *decode.D) {
|
|
sectionOffsets.blendShapesRotationDeformers.targetIndices = int64(d.FieldU32("target_indices", scalar.UintHex))
|
|
sectionOffsets.blendShapesRotationDeformers.blendShapeKeyformBindingSourcesBeginIndices = int64(d.FieldU32("blend_shape_keyform_binding_sources_begin_indices", scalar.UintHex))
|
|
sectionOffsets.blendShapesRotationDeformers.blendShapeKeyformBindingSourcesCounts = int64(d.FieldU32("blend_shape_keyform_binding_sources_counts", scalar.UintHex))
|
|
})
|
|
|
|
d.FieldStruct("blend_shapes_glue", func(d *decode.D) {
|
|
sectionOffsets.blendShapesGlue.targetIndices = int64(d.FieldU32("target_indices", scalar.UintHex))
|
|
sectionOffsets.blendShapesGlue.blendShapeKeyformBindingSourcesBeginIndices = int64(d.FieldU32("blend_shape_keyform_binding_sources_begin_indices", scalar.UintHex))
|
|
sectionOffsets.blendShapesGlue.blendShapeKeyformBindingSourcesCounts = int64(d.FieldU32("blend_shape_keyform_binding_sources_counts", scalar.UintHex))
|
|
})
|
|
}
|
|
|
|
d.FieldRawLen("reserved", d.BitsLeft())
|
|
})
|
|
})
|
|
|
|
d.FieldRawLen("runtime_address_map", 0x480*8)
|
|
d.FieldRawLen("unused1", 0x7c0*8-d.Pos())
|
|
|
|
var countInfo countInfoTable
|
|
d.FieldStruct("sections", func(d *decode.D) {
|
|
d.SeekAbs(sectionOffsets.countInfo * 8)
|
|
d.FieldStruct("count_info", func(d *decode.D) {
|
|
countInfo.parts = int64(d.FieldU32("parts"))
|
|
countInfo.deformers = int64(d.FieldU32("deformers"))
|
|
countInfo.warpDeformers = int64(d.FieldU32("warp_deformers"))
|
|
countInfo.rotationDeformers = int64(d.FieldU32("rotation_deformers"))
|
|
countInfo.artMeshes = int64(d.FieldU32("art_meshes"))
|
|
countInfo.parameters = int64(d.FieldU32("parameters"))
|
|
countInfo.partKeyforms = int64(d.FieldU32("part_keyforms"))
|
|
countInfo.warpDeformerKeyforms = int64(d.FieldU32("warp_deformer_keyforms"))
|
|
countInfo.rotationDeformerKeyforms = int64(d.FieldU32("rotation_deformer_keyforms"))
|
|
countInfo.artMeshKeyforms = int64(d.FieldU32("art_mesh_keyforms"))
|
|
countInfo.keyformPositions = int64(d.FieldU32("keyform_positions"))
|
|
countInfo.parameterBindingIndices = int64(d.FieldU32("parameter_binding_indices"))
|
|
countInfo.keyformBindings = int64(d.FieldU32("keyform_bindings"))
|
|
countInfo.parameterBindings = int64(d.FieldU32("parameter_bindings"))
|
|
countInfo.keys = int64(d.FieldU32("keys"))
|
|
countInfo.uvs = int64(d.FieldU32("uvs"))
|
|
countInfo.positionIndices = int64(d.FieldU32("position_indices"))
|
|
countInfo.drawableMasks = int64(d.FieldU32("drawable_masks"))
|
|
countInfo.drawOrderGroups = int64(d.FieldU32("draw_order_groups"))
|
|
countInfo.drawOrderGroupObjects = int64(d.FieldU32("draw_order_group_objects"))
|
|
countInfo.glue = int64(d.FieldU32("glue"))
|
|
countInfo.glueInfo = int64(d.FieldU32("glue_info"))
|
|
countInfo.glueKeyforms = int64(d.FieldU32("glue_keyforms"))
|
|
|
|
if version >= moc3Version4_02_00 {
|
|
countInfo.keyformMultiplyColors = int64(d.FieldU32("keyform_multiply_colors"))
|
|
countInfo.keyformScreenColors = int64(d.FieldU32("keyform_screen_colors"))
|
|
countInfo.blendShapeParameterBindings = int64(d.FieldU32("blend_shape_parameter_bindings"))
|
|
countInfo.blendShapeKeyformBindings = int64(d.FieldU32("blend_shape_keyform_bindings"))
|
|
countInfo.blendShapesWarpDeformers = int64(d.FieldU32("blend_shapes_warp_deformers"))
|
|
countInfo.blendShapesArtMeshes = int64(d.FieldU32("blend_shapes_art_meshes"))
|
|
countInfo.blendShapeConstraintIndices = int64(d.FieldU32("blend_shape_constraint_indices"))
|
|
countInfo.blendShapeConstraints = int64(d.FieldU32("blend_shape_constraints"))
|
|
countInfo.blendShapeConstraintValues = int64(d.FieldU32("blend_shape_constraint_values"))
|
|
}
|
|
|
|
if version >= moc3Version5_00_00 {
|
|
countInfo.blendShapesParts = int64(d.FieldU32("blend_shapes_parts"))
|
|
countInfo.blendShapesRotationDeformers = int64(d.FieldU32("blend_shapes_rotation_deformers"))
|
|
countInfo.blendShapesGlue = int64(d.FieldU32("blend_shapes_glue"))
|
|
}
|
|
|
|
var reserved int64
|
|
if version >= moc3Version5_00_00 {
|
|
reserved = int64(d.AlignBits(256 * 8))
|
|
} else {
|
|
reserved = int64(d.AlignBits(128 * 8))
|
|
}
|
|
d.FieldRawLen("reserved", reserved)
|
|
})
|
|
|
|
d.SeekAbs(sectionOffsets.canvasInfo * 8)
|
|
d.FieldStruct("canvas_info", func(d *decode.D) {
|
|
d.FieldF32("pixels_per_unit")
|
|
d.FieldF32("origin_x")
|
|
d.FieldF32("origin_y")
|
|
d.FieldF32("canvas_width")
|
|
d.FieldF32("canvas_height")
|
|
d.FieldStruct("canvas_flags", func(d *decode.D) {
|
|
d.FieldU7("reserved")
|
|
d.FieldBool("reverse_y_coordinate")
|
|
})
|
|
|
|
d.FieldRawLen("padding", int64(d.AlignBits(moc3AlignBits)))
|
|
})
|
|
|
|
d.FieldStruct("parts", func(d *decode.D) {
|
|
count := countInfo.parts
|
|
|
|
d.SeekAbs(sectionOffsets.parts.runtimeSpace0 * 8)
|
|
fieldRuntimeSpace(d, "runtime_space0", count, false)
|
|
|
|
d.SeekAbs(sectionOffsets.parts.ids * 8)
|
|
fieldAlignedNArray(d, "ids", count, func(d *decode.D) { d.FieldUTF8NullFixedLen("id", 64) })
|
|
|
|
d.SeekAbs(sectionOffsets.parts.keyformBindingSourcesIndices * 8)
|
|
fieldAlignedNArray(d, "keyform_binding_sources_indices", count, func(d *decode.D) { d.FieldS32("index") })
|
|
|
|
d.SeekAbs(sectionOffsets.parts.keyformSourcesBeginIndices * 8)
|
|
fieldAlignedNArray(d, "keyform_sources_begin_indices", count, func(d *decode.D) { d.FieldS32("index") })
|
|
|
|
d.SeekAbs(sectionOffsets.parts.keyformSourcesCounts * 8)
|
|
fieldAlignedNArray(d, "keyform_sources_counts", count, func(d *decode.D) { d.FieldS32("index") })
|
|
|
|
d.SeekAbs(sectionOffsets.parts.isVisible * 8)
|
|
fieldAlignedNArray(d, "is_visible", count, func(d *decode.D) { d.FieldU32("visible", boolNToSym) })
|
|
|
|
d.SeekAbs(sectionOffsets.parts.isEnabled * 8)
|
|
fieldAlignedNArray(d, "is_enabled", count, func(d *decode.D) { d.FieldU32("enabled", boolNToSym) })
|
|
|
|
d.SeekAbs(sectionOffsets.parts.parentPartIndices * 8)
|
|
fieldAlignedNArray(d, "parent_part_indices", count, func(d *decode.D) { d.FieldS32("index") })
|
|
})
|
|
|
|
d.FieldStruct("deformers", func(d *decode.D) {
|
|
count := countInfo.deformers
|
|
|
|
d.SeekAbs(sectionOffsets.deformers.runtimeSpace0 * 8)
|
|
fieldRuntimeSpace(d, "runtime_space0", count, false)
|
|
|
|
d.SeekAbs(sectionOffsets.deformers.ids * 8)
|
|
fieldAlignedNArray(d, "ids", count, func(d *decode.D) { d.FieldUTF8NullFixedLen("id", 64) })
|
|
|
|
d.SeekAbs(sectionOffsets.deformers.keyformBindingSourcesIndices * 8)
|
|
fieldAlignedNArray(d, "keyform_binding_sources_indices", count, func(d *decode.D) { d.FieldS32("index") })
|
|
|
|
d.SeekAbs(sectionOffsets.deformers.isVisible * 8)
|
|
fieldAlignedNArray(d, "is_visible", count, func(d *decode.D) { d.FieldU32("visible", boolNToSym) })
|
|
|
|
d.SeekAbs(sectionOffsets.deformers.isEnabled * 8)
|
|
fieldAlignedNArray(d, "is_enabled", count, func(d *decode.D) { d.FieldU32("enabled", boolNToSym) })
|
|
|
|
d.SeekAbs(sectionOffsets.deformers.parentPartIndices * 8)
|
|
fieldAlignedNArray(d, "parent_part_indices", count, func(d *decode.D) { d.FieldS32("index") })
|
|
|
|
d.SeekAbs(sectionOffsets.deformers.parentDeformerIndices * 8)
|
|
fieldAlignedNArray(d, "parent_deformer_indices", count, func(d *decode.D) { d.FieldS32("index") })
|
|
|
|
d.SeekAbs(sectionOffsets.deformers.types * 8)
|
|
fieldAlignedNArray(d, "types", count, func(d *decode.D) { d.FieldU32("type", deformerTypeNames) })
|
|
|
|
d.SeekAbs(sectionOffsets.deformers.specificSourcesIndices * 8)
|
|
fieldAlignedNArray(d, "specific_sources_indices", count, func(d *decode.D) { d.FieldS32("index") })
|
|
})
|
|
|
|
d.FieldStruct("warp_deformers", func(d *decode.D) {
|
|
count := countInfo.warpDeformers
|
|
|
|
d.SeekAbs(sectionOffsets.warpDeformers.keyformBindingSourcesIndices * 8)
|
|
fieldAlignedNArray(d, "keyform_binding_sources_indices", count, func(d *decode.D) { d.FieldS32("index") })
|
|
|
|
d.SeekAbs(sectionOffsets.warpDeformers.keyformSourcesBeginIndices * 8)
|
|
fieldAlignedNArray(d, "keyform_sources_begin_indices", count, func(d *decode.D) { d.FieldS32("index") })
|
|
|
|
d.SeekAbs(sectionOffsets.warpDeformers.keyformSourcesCounts * 8)
|
|
fieldAlignedNArray(d, "keyform_sources_counts", count, func(d *decode.D) { d.FieldS32("index") })
|
|
|
|
d.SeekAbs(sectionOffsets.warpDeformers.vertexCounts * 8)
|
|
fieldAlignedNArray(d, "vertex_counts", count, func(d *decode.D) { d.FieldS32("count") })
|
|
|
|
d.SeekAbs(sectionOffsets.warpDeformers.rows * 8)
|
|
fieldAlignedNArray(d, "rows", count, func(d *decode.D) { d.FieldU32("row") })
|
|
|
|
d.SeekAbs(sectionOffsets.warpDeformers.columns * 8)
|
|
fieldAlignedNArray(d, "columns", count, func(d *decode.D) { d.FieldU32("column") })
|
|
|
|
if version >= moc3Version3_03_00 {
|
|
d.SeekAbs(sectionOffsets.warpDeformersV3_3.isQuadSource * 8)
|
|
fieldAlignedNArray(d, "is_quad_source", count, func(d *decode.D) { d.FieldU32("quad_source", boolNToSym) })
|
|
}
|
|
|
|
if version >= moc3Version4_02_00 {
|
|
d.SeekAbs(sectionOffsets.warpDeformersV4_2.keyformColorSourcesBeginIndices * 8)
|
|
fieldAlignedNArray(d, "keyform_color_sources_begin_indices", count, func(d *decode.D) { d.FieldS32("index") })
|
|
}
|
|
})
|
|
|
|
d.FieldStruct("rotation_deformers", func(d *decode.D) {
|
|
count := countInfo.rotationDeformers
|
|
|
|
d.SeekAbs(sectionOffsets.rotationDeformers.keyformBindingSourcesIndices * 8)
|
|
fieldAlignedNArray(d, "keyform_binding_sources_indices", count, func(d *decode.D) { d.FieldS32("index") })
|
|
|
|
d.SeekAbs(sectionOffsets.rotationDeformers.keyformSourcesBeginIndices * 8)
|
|
fieldAlignedNArray(d, "keyform_sources_begin_indices", count, func(d *decode.D) { d.FieldS32("index") })
|
|
|
|
d.SeekAbs(sectionOffsets.rotationDeformers.keyformSourcesCounts * 8)
|
|
fieldAlignedNArray(d, "keyform_sources_counts", count, func(d *decode.D) { d.FieldS32("index") })
|
|
|
|
d.SeekAbs(sectionOffsets.rotationDeformers.baseAngles * 8)
|
|
fieldAlignedNArray(d, "base_angles", count, func(d *decode.D) { d.FieldF32("angle") })
|
|
|
|
if version >= moc3Version4_02_00 {
|
|
d.SeekAbs(sectionOffsets.rotationDeformersV4_2.keyformColorSourcesBeginIndices * 8)
|
|
fieldAlignedNArray(d, "keyform_color_sources_begin_indices", count, func(d *decode.D) { d.FieldS32("index") })
|
|
}
|
|
})
|
|
|
|
d.FieldStruct("art_meshes", func(d *decode.D) {
|
|
count := countInfo.artMeshes
|
|
|
|
d.SeekAbs(sectionOffsets.artMeshes.runtimeSpace0 * 8)
|
|
fieldRuntimeSpace(d, "runtime_space0", count, true)
|
|
|
|
d.SeekAbs(sectionOffsets.artMeshes.runtimeSpace1 * 8)
|
|
fieldRuntimeSpace(d, "runtime_space1", count, true)
|
|
|
|
d.SeekAbs(sectionOffsets.artMeshes.runtimeSpace2 * 8)
|
|
fieldRuntimeSpace(d, "runtime_space2", count, true)
|
|
|
|
d.SeekAbs(sectionOffsets.artMeshes.runtimeSpace3 * 8)
|
|
fieldRuntimeSpace(d, "runtime_space3", count, false)
|
|
|
|
d.SeekAbs(sectionOffsets.artMeshes.ids * 8)
|
|
fieldAlignedNArray(d, "ids", count, func(d *decode.D) { d.FieldUTF8NullFixedLen("id", 64) })
|
|
|
|
d.SeekAbs(sectionOffsets.artMeshes.keyformBindingSourcesIndices * 8)
|
|
fieldAlignedNArray(d, "keyform_binding_sources_indices", count, func(d *decode.D) { d.FieldS32("index") })
|
|
|
|
d.SeekAbs(sectionOffsets.artMeshes.keyformSourcesBeginIndices * 8)
|
|
fieldAlignedNArray(d, "keyform_sources_begin_indices", count, func(d *decode.D) { d.FieldS32("index") })
|
|
|
|
d.SeekAbs(sectionOffsets.artMeshes.keyformSourcesCounts * 8)
|
|
fieldAlignedNArray(d, "keyform_sources_counts", count, func(d *decode.D) { d.FieldS32("index") })
|
|
|
|
d.SeekAbs(sectionOffsets.artMeshes.isVisible * 8)
|
|
fieldAlignedNArray(d, "is_visible", count, func(d *decode.D) { d.FieldU32("visible", boolNToSym) })
|
|
|
|
d.SeekAbs(sectionOffsets.artMeshes.isEnabled * 8)
|
|
fieldAlignedNArray(d, "is_enabled", count, func(d *decode.D) { d.FieldU32("enabled", boolNToSym) })
|
|
|
|
d.SeekAbs(sectionOffsets.artMeshes.parentPartIndices * 8)
|
|
fieldAlignedNArray(d, "parent_part_indices", count, func(d *decode.D) { d.FieldS32("index") })
|
|
|
|
d.SeekAbs(sectionOffsets.artMeshes.parentDeformerIndices * 8)
|
|
fieldAlignedNArray(d, "parent_deformer_indices", count, func(d *decode.D) { d.FieldS32("index") })
|
|
|
|
d.SeekAbs(sectionOffsets.artMeshes.textureNos * 8)
|
|
fieldAlignedNArray(d, "texture_nos", count, func(d *decode.D) { d.FieldU32("texture_no") })
|
|
|
|
d.SeekAbs(sectionOffsets.artMeshes.drawableFlags * 8)
|
|
fieldAlignedNArray(d, "drawable_flags", count, func(d *decode.D) {
|
|
d.FieldStruct("flags", func(d *decode.D) {
|
|
d.FieldU4("reserved")
|
|
d.FieldBool("is_inverted")
|
|
d.FieldBool("is_double_sided")
|
|
d.FieldU2("blend_mode", blendModeNames)
|
|
})
|
|
})
|
|
|
|
d.SeekAbs(sectionOffsets.artMeshes.vertexCounts * 8)
|
|
fieldAlignedNArray(d, "vertex_counts", count, func(d *decode.D) { d.FieldS32("count") })
|
|
|
|
d.SeekAbs(sectionOffsets.artMeshes.uvSourcesBeginIndices * 8)
|
|
fieldAlignedNArray(d, "uv_sources_begin_indices", count, func(d *decode.D) { d.FieldS32("index") })
|
|
|
|
d.SeekAbs(sectionOffsets.artMeshes.positionIndexSourcesBeginIndices * 8)
|
|
fieldAlignedNArray(d, "position_index_sources_begin_indices", count, func(d *decode.D) { d.FieldS32("index") })
|
|
|
|
d.SeekAbs(sectionOffsets.artMeshes.positionIndexSourcesCounts * 8)
|
|
fieldAlignedNArray(d, "position_index_sources_counts", count, func(d *decode.D) { d.FieldS32("count") })
|
|
|
|
d.SeekAbs(sectionOffsets.artMeshes.drawableMaskSourcesBeginIndices * 8)
|
|
fieldAlignedNArray(d, "drawable_mask_sources_begin_indices", count, func(d *decode.D) { d.FieldS32("index") })
|
|
|
|
d.SeekAbs(sectionOffsets.artMeshes.drawableMaskSourcesCounts * 8)
|
|
fieldAlignedNArray(d, "drawable_mask_sources_counts", count, func(d *decode.D) { d.FieldS32("count") })
|
|
|
|
if version >= moc3Version4_02_00 {
|
|
d.SeekAbs(sectionOffsets.artMeshesV4_2.keyformColorSourcesBeginIndices * 8)
|
|
fieldAlignedNArray(d, "keyform_color_sources_begin_indices", count, func(d *decode.D) { d.FieldS32("index") })
|
|
}
|
|
})
|
|
|
|
d.FieldStruct("parameters", func(d *decode.D) {
|
|
count := countInfo.parameters
|
|
|
|
d.SeekAbs(sectionOffsets.parameters.runtimeSpace0 * 8)
|
|
fieldRuntimeSpace(d, "runtime_space0", count, false)
|
|
|
|
d.SeekAbs(sectionOffsets.parameters.ids * 8)
|
|
fieldAlignedNArray(d, "ids", count, func(d *decode.D) { d.FieldUTF8NullFixedLen("id", 64) })
|
|
|
|
d.SeekAbs(sectionOffsets.parameters.maxValues * 8)
|
|
fieldAlignedNArray(d, "max_values", count, func(d *decode.D) { d.FieldF32("value") })
|
|
|
|
d.SeekAbs(sectionOffsets.parameters.minValues * 8)
|
|
fieldAlignedNArray(d, "min_values", count, func(d *decode.D) { d.FieldF32("value") })
|
|
|
|
d.SeekAbs(sectionOffsets.parameters.defaultValues * 8)
|
|
fieldAlignedNArray(d, "default_values", count, func(d *decode.D) { d.FieldF32("value") })
|
|
|
|
d.SeekAbs(sectionOffsets.parameters.isRepeat * 8)
|
|
fieldAlignedNArray(d, "is_repeat", count, func(d *decode.D) { d.FieldU32("repeat", boolNToSym) })
|
|
|
|
d.SeekAbs(sectionOffsets.parameters.decimalPlaces * 8)
|
|
fieldAlignedNArray(d, "decimal_places", count, func(d *decode.D) { d.FieldU32("value") })
|
|
|
|
d.SeekAbs(sectionOffsets.parameters.parameterBindingSourcesBeginIndices * 8)
|
|
fieldAlignedNArray(d, "parameter_binding_sources_begin_indices", count, func(d *decode.D) { d.FieldS32("index") })
|
|
|
|
d.SeekAbs(sectionOffsets.parameters.parameterBindingSourcesCounts * 8)
|
|
fieldAlignedNArray(d, "parameter_binding_sources_counts", count, func(d *decode.D) { d.FieldS32("count") })
|
|
|
|
if version >= moc3Version4_02_00 {
|
|
d.SeekAbs(sectionOffsets.parametersV4_2.parameterTypes * 8)
|
|
fieldAlignedNArray(d, "parameter_types", count, func(d *decode.D) { d.FieldU32("type", parameterTypeNames) })
|
|
|
|
d.SeekAbs(sectionOffsets.parametersV4_2.blendShapeParameterBindingSourcesBeginIndices * 8)
|
|
fieldAlignedNArray(d, "blend_shape_parameter_binding_sources_begin_indices", count, func(d *decode.D) { d.FieldS32("index") })
|
|
|
|
d.SeekAbs(sectionOffsets.parametersV4_2.blendShapeParameterBindingSourcesCounts * 8)
|
|
fieldAlignedNArray(d, "blend_shape_parameter_binding_sources_counts", count, func(d *decode.D) { d.FieldS32("count") })
|
|
}
|
|
})
|
|
|
|
d.FieldStruct("part_keyforms", func(d *decode.D) {
|
|
d.SeekAbs(sectionOffsets.partKeyforms.drawOrders * 8)
|
|
fieldAlignedNArray(d, "draw_orders", countInfo.partKeyforms, func(d *decode.D) { d.FieldF32("draw_order") })
|
|
})
|
|
|
|
d.FieldStruct("warp_deformer_keyforms", func(d *decode.D) {
|
|
count := countInfo.warpDeformerKeyforms
|
|
|
|
d.SeekAbs(sectionOffsets.warpDeformerKeyforms.opacities * 8)
|
|
fieldAlignedNArray(d, "opacities", count, func(d *decode.D) { d.FieldF32("opacity") })
|
|
|
|
d.SeekAbs(sectionOffsets.warpDeformerKeyforms.keyformPositionSourcesBeginIndices * 8)
|
|
fieldAlignedNArray(d, "keyform_position_sources_begin_indices", count, func(d *decode.D) { d.FieldS32("index") })
|
|
|
|
if version >= moc3Version5_00_00 {
|
|
d.SeekAbs(sectionOffsets.warpDeformerKeyformsV5_0.keyformMultiplyColorSourcesBeginIndices * 8)
|
|
fieldAlignedNArray(d, "keyform_multiply_color_sources_begin_indices", count, func(d *decode.D) { d.FieldS32("index") })
|
|
|
|
d.SeekAbs(sectionOffsets.warpDeformerKeyformsV5_0.keyformScreenColorSourcesBeginIndices * 8)
|
|
fieldAlignedNArray(d, "keyform_screen_color_sources_begin_indices", count, func(d *decode.D) { d.FieldS32("index") })
|
|
}
|
|
})
|
|
|
|
d.FieldStruct("rotation_deformer_keyforms", func(d *decode.D) {
|
|
count := countInfo.rotationDeformerKeyforms
|
|
|
|
d.SeekAbs(sectionOffsets.rotationDeformerKeyforms.opacities * 8)
|
|
fieldAlignedNArray(d, "opacities", count, func(d *decode.D) { d.FieldF32("value") })
|
|
|
|
d.SeekAbs(sectionOffsets.rotationDeformerKeyforms.angles * 8)
|
|
fieldAlignedNArray(d, "angles", count, func(d *decode.D) { d.FieldF32("angle") })
|
|
|
|
d.SeekAbs(sectionOffsets.rotationDeformerKeyforms.originX * 8)
|
|
fieldAlignedNArray(d, "origin_x", count, func(d *decode.D) { d.FieldF32("x") })
|
|
|
|
d.SeekAbs(sectionOffsets.rotationDeformerKeyforms.originY * 8)
|
|
fieldAlignedNArray(d, "origin_y", count, func(d *decode.D) { d.FieldF32("y") })
|
|
|
|
d.SeekAbs(sectionOffsets.rotationDeformerKeyforms.scales * 8)
|
|
fieldAlignedNArray(d, "scales", count, func(d *decode.D) { d.FieldF32("value") })
|
|
|
|
d.SeekAbs(sectionOffsets.rotationDeformerKeyforms.isReflectX * 8)
|
|
fieldAlignedNArray(d, "is_reflect_x", count, func(d *decode.D) { d.FieldU32("reflect_x", boolNToSym) })
|
|
|
|
d.SeekAbs(sectionOffsets.rotationDeformerKeyforms.isReflectY * 8)
|
|
fieldAlignedNArray(d, "is_reflect_y", count, func(d *decode.D) { d.FieldU32("reflect_y", boolNToSym) })
|
|
|
|
if version >= moc3Version5_00_00 {
|
|
d.SeekAbs(sectionOffsets.rotationDeformerKeyformsV5_0.keyformMultiplyColorSourcesBeginIndices * 8)
|
|
fieldAlignedNArray(d, "keyform_multiply_color_sources_begin_indices", count, func(d *decode.D) { d.FieldS32("index") })
|
|
|
|
d.SeekAbs(sectionOffsets.rotationDeformerKeyformsV5_0.keyformScreenColorSourcesBeginIndices * 8)
|
|
fieldAlignedNArray(d, "keyform_screen_color_sources_begin_indices", count, func(d *decode.D) { d.FieldS32("index") })
|
|
}
|
|
})
|
|
|
|
d.FieldStruct("art_mesh_keyforms", func(d *decode.D) {
|
|
count := countInfo.artMeshKeyforms
|
|
|
|
d.SeekAbs(sectionOffsets.artMeshKeyforms.opacities * 8)
|
|
fieldAlignedNArray(d, "opacities", count, func(d *decode.D) { d.FieldF32("value") })
|
|
|
|
d.SeekAbs(sectionOffsets.artMeshKeyforms.drawOrders * 8)
|
|
fieldAlignedNArray(d, "draw_orders", count, func(d *decode.D) { d.FieldF32("draw_order") })
|
|
|
|
d.SeekAbs(sectionOffsets.artMeshKeyforms.keyformPositionSourcesBeginIndices * 8)
|
|
fieldAlignedNArray(d, "keyform_position_sources_begin_indices", count, func(d *decode.D) { d.FieldS32("index") })
|
|
|
|
if version >= moc3Version5_00_00 {
|
|
d.SeekAbs(sectionOffsets.artMeshKeyformsV5_0.keyformMultiplyColorSourcesBeginIndices * 8)
|
|
fieldAlignedNArray(d, "keyform_multiply_color_sources_begin_indices", count, func(d *decode.D) { d.FieldS32("index") })
|
|
|
|
d.SeekAbs(sectionOffsets.artMeshKeyformsV5_0.keyformScreenColorSourcesBeginIndices * 8)
|
|
fieldAlignedNArray(d, "keyform_screen_color_sources_begin_indices", count, func(d *decode.D) { d.FieldS32("index") })
|
|
}
|
|
})
|
|
|
|
d.FieldStruct("keyform_positions", func(d *decode.D) {
|
|
d.SeekAbs(sectionOffsets.keyformPositions.xys * 8)
|
|
fieldAlignedNArray(d, "xys", countInfo.keyformPositions/2, func(d *decode.D) { d.FieldF32("x"); d.FieldF32("y") })
|
|
})
|
|
|
|
d.FieldStruct("parameter_binding_indices", func(d *decode.D) {
|
|
d.SeekAbs(sectionOffsets.parameterBindingIndices.bindingSourcesIndices * 8)
|
|
fieldAlignedNArray(d, "binding_sources_indices", countInfo.parameterBindingIndices, func(d *decode.D) { d.FieldS32("index") })
|
|
})
|
|
|
|
d.FieldStruct("keyform_bindings", func(d *decode.D) {
|
|
count := countInfo.keyformBindings
|
|
|
|
d.SeekAbs(sectionOffsets.keyformBindings.parameterBindingIndexSourcesBeginIndices * 8)
|
|
fieldAlignedNArray(d, "parameter_binding_index_sources_begin_indices", count, func(d *decode.D) { d.FieldS32("index") })
|
|
|
|
d.SeekAbs(sectionOffsets.keyformBindings.parameterBindingIndexSourcesCounts * 8)
|
|
fieldAlignedNArray(d, "parameter_binding_index_sources_counts", count, func(d *decode.D) { d.FieldS32("count") })
|
|
})
|
|
|
|
d.FieldStruct("parameter_bindings", func(d *decode.D) {
|
|
count := countInfo.parameterBindings
|
|
|
|
d.SeekAbs(sectionOffsets.parameterBindings.keysSourcesBeginIndices * 8)
|
|
fieldAlignedNArray(d, "keys_sources_begin_indices", count, func(d *decode.D) { d.FieldS32("index") })
|
|
|
|
d.SeekAbs(sectionOffsets.parameterBindings.keysSourcesCounts * 8)
|
|
fieldAlignedNArray(d, "keys_sources_counts", count, func(d *decode.D) { d.FieldS32("count") })
|
|
})
|
|
|
|
d.FieldStruct("keys", func(d *decode.D) {
|
|
d.SeekAbs(sectionOffsets.keys.values * 8)
|
|
fieldAlignedNArray(d, "values", countInfo.keys, func(d *decode.D) { d.FieldF32("value") })
|
|
})
|
|
|
|
d.FieldStruct("uvs", func(d *decode.D) {
|
|
d.SeekAbs(sectionOffsets.UVs.uvs * 8)
|
|
fieldAlignedNArray(d, "uvs", countInfo.uvs/2, func(d *decode.D) { d.FieldF32("u"); d.FieldF32("v") })
|
|
})
|
|
|
|
d.FieldStruct("position_indices", func(d *decode.D) {
|
|
d.SeekAbs(sectionOffsets.positionIndices.indices * 8)
|
|
fieldAlignedNArray(d, "indices", countInfo.positionIndices, func(d *decode.D) { d.FieldS16("index") })
|
|
})
|
|
|
|
d.FieldStruct("drawable_masks", func(d *decode.D) {
|
|
d.SeekAbs(sectionOffsets.drawableMasks.artMeshSourcesIndices * 8)
|
|
fieldAlignedNArray(d, "art_mesh_sources_indices", countInfo.drawableMasks, func(d *decode.D) { d.FieldS32("index") })
|
|
})
|
|
|
|
d.FieldStruct("draw_order_groups", func(d *decode.D) {
|
|
count := countInfo.drawOrderGroups
|
|
|
|
d.SeekAbs(sectionOffsets.drawOrderGroups.objectSourcesBeginIndices * 8)
|
|
fieldAlignedNArray(d, "object_sources_begin_indices", count, func(d *decode.D) { d.FieldS32("index") })
|
|
|
|
d.SeekAbs(sectionOffsets.drawOrderGroups.objectSourcesCounts * 8)
|
|
fieldAlignedNArray(d, "object_sources_counts", count, func(d *decode.D) { d.FieldS32("count") })
|
|
|
|
d.SeekAbs(sectionOffsets.drawOrderGroups.objectSourcesTotalCounts * 8)
|
|
fieldAlignedNArray(d, "object_sources_total_counts", count, func(d *decode.D) { d.FieldS32("count") })
|
|
|
|
d.SeekAbs(sectionOffsets.drawOrderGroups.maximumDrawOrders * 8)
|
|
fieldAlignedNArray(d, "maximum_draw_orders", count, func(d *decode.D) { d.FieldU32("draw_order") })
|
|
|
|
d.SeekAbs(sectionOffsets.drawOrderGroups.minimumDrawOrders * 8)
|
|
fieldAlignedNArray(d, "minimum_draw_orders", count, func(d *decode.D) { d.FieldU32("draw_order") })
|
|
})
|
|
|
|
d.FieldStruct("draw_order_group_objects", func(d *decode.D) {
|
|
count := countInfo.drawOrderGroupObjects
|
|
|
|
d.SeekAbs(sectionOffsets.drawOrderGroupObjects.types * 8)
|
|
fieldAlignedNArray(d, "types", count, func(d *decode.D) { d.FieldU32("type", drawOrderGroupObjectTypeNames) })
|
|
|
|
d.SeekAbs(sectionOffsets.drawOrderGroupObjects.indices * 8)
|
|
fieldAlignedNArray(d, "indices", count, func(d *decode.D) { d.FieldS32("index") })
|
|
|
|
d.SeekAbs(sectionOffsets.drawOrderGroupObjects.selfIndices * 8)
|
|
fieldAlignedNArray(d, "self_indices", count, func(d *decode.D) { d.FieldS32("index") })
|
|
})
|
|
|
|
d.FieldStruct("glue", func(d *decode.D) {
|
|
count := countInfo.glue
|
|
|
|
d.SeekAbs(sectionOffsets.glue.runtimeSpace0 * 8)
|
|
fieldRuntimeSpace(d, "runtime_space0", count, false)
|
|
|
|
d.SeekAbs(sectionOffsets.glue.ids * 8)
|
|
fieldAlignedNArray(d, "ids", count, func(d *decode.D) { d.FieldUTF8NullFixedLen("id", 64) })
|
|
|
|
d.SeekAbs(sectionOffsets.glue.keyformBindingSourcesIndices * 8)
|
|
fieldAlignedNArray(d, "keyform_binding_sources_indices", count, func(d *decode.D) { d.FieldS32("index") })
|
|
|
|
d.SeekAbs(sectionOffsets.glue.keyformSourcesBeginIndices * 8)
|
|
fieldAlignedNArray(d, "keyform_sources_begin_indices", count, func(d *decode.D) { d.FieldS32("index") })
|
|
|
|
d.SeekAbs(sectionOffsets.glue.keyformSourcesCounts * 8)
|
|
fieldAlignedNArray(d, "keyform_sources_counts", count, func(d *decode.D) { d.FieldS32("index") })
|
|
|
|
d.SeekAbs(sectionOffsets.glue.artMeshIndicesA * 8)
|
|
fieldAlignedNArray(d, "art_mesh_indices_a", count, func(d *decode.D) { d.FieldS32("index") })
|
|
|
|
d.SeekAbs(sectionOffsets.glue.artMeshIndicesB * 8)
|
|
fieldAlignedNArray(d, "art_mesh_indices_b", count, func(d *decode.D) { d.FieldS32("index") })
|
|
|
|
d.SeekAbs(sectionOffsets.glue.glueInfoSourcesBeginIndices * 8)
|
|
fieldAlignedNArray(d, "glue_info_sources_begin_indices", count, func(d *decode.D) { d.FieldS32("index") })
|
|
|
|
d.SeekAbs(sectionOffsets.glue.glueInfoSourcesCounts * 8)
|
|
fieldAlignedNArray(d, "glue_info_sources_counts", count, func(d *decode.D) { d.FieldS32("count") })
|
|
})
|
|
|
|
d.FieldStruct("glue_info", func(d *decode.D) {
|
|
count := countInfo.glueInfo
|
|
|
|
d.SeekAbs(sectionOffsets.glueInfo.weights * 8)
|
|
fieldAlignedNArray(d, "weights", count, func(d *decode.D) { d.FieldF32("value") })
|
|
|
|
d.SeekAbs(sectionOffsets.glueInfo.positionIndices * 8)
|
|
fieldAlignedNArray(d, "position_indices", count, func(d *decode.D) { d.FieldS16("index") })
|
|
})
|
|
|
|
d.FieldStruct("glue_keyforms", func(d *decode.D) {
|
|
d.SeekAbs(sectionOffsets.glueKeyforms.intensities * 8)
|
|
fieldAlignedNArray(d, "intensities", countInfo.glueKeyforms, func(d *decode.D) { d.FieldF32("value") })
|
|
})
|
|
|
|
if version >= moc3Version4_02_00 {
|
|
d.FieldStruct("parameter_extensions", func(d *decode.D) {
|
|
count := countInfo.parameters
|
|
|
|
d.SeekAbs(sectionOffsets.parameterExtensions.runtimeSpace0 * 8)
|
|
fieldRuntimeSpace(d, "runtime_space0", count, false)
|
|
|
|
d.SeekAbs(sectionOffsets.parameterExtensions.keysSourcesBeginIndices * 8)
|
|
fieldAlignedNArray(d, "keys_sources_begin_indices", count, func(d *decode.D) { d.FieldS32("index") })
|
|
|
|
d.SeekAbs(sectionOffsets.parameterExtensions.keysSourcesCounts * 8)
|
|
fieldAlignedNArray(d, "keys_sources_counts", count, func(d *decode.D) { d.FieldS32("count") })
|
|
})
|
|
|
|
d.FieldStruct("keyform_multiply_colors", func(d *decode.D) {
|
|
count := countInfo.keyformMultiplyColors
|
|
|
|
d.SeekAbs(sectionOffsets.keyformMultiplyColors.r * 8)
|
|
fieldAlignedNArray(d, "r", count, func(d *decode.D) { d.FieldF32("value") })
|
|
|
|
d.SeekAbs(sectionOffsets.keyformMultiplyColors.g * 8)
|
|
fieldAlignedNArray(d, "g", count, func(d *decode.D) { d.FieldF32("value") })
|
|
|
|
d.SeekAbs(sectionOffsets.keyformMultiplyColors.b * 8)
|
|
fieldAlignedNArray(d, "b", count, func(d *decode.D) { d.FieldF32("value") })
|
|
})
|
|
|
|
d.FieldStruct("keyform_screen_colors", func(d *decode.D) {
|
|
count := countInfo.keyformScreenColors
|
|
|
|
d.SeekAbs(sectionOffsets.keyformScreenColors.r * 8)
|
|
fieldAlignedNArray(d, "r", count, func(d *decode.D) { d.FieldF32("value") })
|
|
|
|
d.SeekAbs(sectionOffsets.keyformScreenColors.g * 8)
|
|
fieldAlignedNArray(d, "g", count, func(d *decode.D) { d.FieldF32("value") })
|
|
|
|
d.SeekAbs(sectionOffsets.keyformScreenColors.b * 8)
|
|
fieldAlignedNArray(d, "b", count, func(d *decode.D) { d.FieldF32("value") })
|
|
})
|
|
|
|
d.FieldStruct("blend_shape_parameter_bindings", func(d *decode.D) {
|
|
count := countInfo.blendShapeParameterBindings
|
|
|
|
d.SeekAbs(sectionOffsets.blendShapeParameterBindings.keysSourcesBeginIndices * 8)
|
|
fieldAlignedNArray(d, "keys_sources_begin_indices", count, func(d *decode.D) { d.FieldS32("index") })
|
|
|
|
d.SeekAbs(sectionOffsets.blendShapeParameterBindings.keysSourcesCounts * 8)
|
|
fieldAlignedNArray(d, "keys_sources_counts", count, func(d *decode.D) { d.FieldS32("count") })
|
|
|
|
d.SeekAbs(sectionOffsets.blendShapeParameterBindings.baseKeyIndices * 8)
|
|
fieldAlignedNArray(d, "base_key_indices", count, func(d *decode.D) { d.FieldS32("index") })
|
|
})
|
|
|
|
d.FieldStruct("blend_shape_keyform_bindings", func(d *decode.D) {
|
|
count := countInfo.blendShapeKeyformBindings
|
|
|
|
d.SeekAbs(sectionOffsets.blendShapeKeyformBindings.parameterBindingSourcesIndices * 8)
|
|
fieldAlignedNArray(d, "parameter_binding_sources_indices", count, func(d *decode.D) { d.FieldS32("index") })
|
|
|
|
d.SeekAbs(sectionOffsets.blendShapeKeyformBindings.keyformSourcesBlendShapeIndices * 8)
|
|
fieldAlignedNArray(d, "keyform_sources_blend_shape_indices", count, func(d *decode.D) { d.FieldS32("index") })
|
|
|
|
d.SeekAbs(sectionOffsets.blendShapeKeyformBindings.keyformSourcesBlendShapeCounts * 8)
|
|
fieldAlignedNArray(d, "keyform_sources_blend_shape_counts", count, func(d *decode.D) { d.FieldS32("count") })
|
|
|
|
d.SeekAbs(sectionOffsets.blendShapeKeyformBindings.blendShapeConstraintIndexSourcesBeginIndices * 8)
|
|
fieldAlignedNArray(d, "blend_shape_constraint_index_sources_begin_indices", count, func(d *decode.D) { d.FieldS32("index") })
|
|
|
|
d.SeekAbs(sectionOffsets.blendShapeKeyformBindings.blendShapeConstraintIndexSourcesCounts * 8)
|
|
fieldAlignedNArray(d, "blend_shape_constraint_index_sources_counts", count, func(d *decode.D) { d.FieldS32("count") })
|
|
})
|
|
|
|
d.FieldStruct("blend_shapes_warp_deformers", func(d *decode.D) {
|
|
count := countInfo.blendShapesWarpDeformers
|
|
|
|
d.SeekAbs(sectionOffsets.blendShapesWarpDeformers.targetIndices * 8)
|
|
fieldAlignedNArray(d, "target_indices", count, func(d *decode.D) { d.FieldS32("index") })
|
|
|
|
d.SeekAbs(sectionOffsets.blendShapesWarpDeformers.blendShapeKeyformBindingSourcesBeginIndices * 8)
|
|
fieldAlignedNArray(d, "blend_shape_keyform_binding_sources_begin_indices", count, func(d *decode.D) { d.FieldS32("index") })
|
|
|
|
d.SeekAbs(sectionOffsets.blendShapesWarpDeformers.blendShapeKeyformBindingSourcesCounts * 8)
|
|
fieldAlignedNArray(d, "blend_shape_keyform_binding_sources_counts", count, func(d *decode.D) { d.FieldS32("count") })
|
|
})
|
|
|
|
d.FieldStruct("blend_shapes_art_meshes", func(d *decode.D) {
|
|
count := countInfo.blendShapesArtMeshes
|
|
|
|
d.SeekAbs(sectionOffsets.blendShapesArtMeshes.targetIndices * 8)
|
|
fieldAlignedNArray(d, "target_indices", count, func(d *decode.D) { d.FieldS32("index") })
|
|
|
|
d.SeekAbs(sectionOffsets.blendShapesArtMeshes.blendShapeKeyformBindingSourcesBeginIndices * 8)
|
|
fieldAlignedNArray(d, "blend_shape_keyform_binding_sources_begin_indices", count, func(d *decode.D) { d.FieldS32("index") })
|
|
|
|
d.SeekAbs(sectionOffsets.blendShapesArtMeshes.blendShapeKeyformBindingSourcesCounts * 8)
|
|
fieldAlignedNArray(d, "blend_shape_keyform_binding_sources_counts", count, func(d *decode.D) { d.FieldS32("count") })
|
|
})
|
|
|
|
d.FieldStruct("blend_shape_constraint_indices", func(d *decode.D) {
|
|
d.SeekAbs(sectionOffsets.blendShapeConstraintIndices.blendShapeConstraintSourcesIndices * 8)
|
|
fieldAlignedNArray(d, "blend_shape_constraint_sources_indices", countInfo.blendShapeConstraintIndices, func(d *decode.D) { d.FieldS32("index") })
|
|
})
|
|
|
|
d.FieldStruct("blend_shape_constraints", func(d *decode.D) {
|
|
count := countInfo.blendShapeConstraints
|
|
|
|
d.SeekAbs(sectionOffsets.blendShapeConstraints.parameterIndices * 8)
|
|
fieldAlignedNArray(d, "parameter_indices", count, func(d *decode.D) { d.FieldS32("index") })
|
|
|
|
d.SeekAbs(sectionOffsets.blendShapeConstraints.blendShapeConstraintValueSourcesBeginIndices * 8)
|
|
fieldAlignedNArray(d, "blend_shape_constraint_value_sources_begin_indices", count, func(d *decode.D) { d.FieldS32("index") })
|
|
|
|
d.SeekAbs(sectionOffsets.blendShapeConstraints.blendShapeConstraintValueSourcesCounts * 8)
|
|
fieldAlignedNArray(d, "blend_shape_constraint_value_sources_counts", count, func(d *decode.D) { d.FieldS32("count") })
|
|
})
|
|
|
|
d.FieldStruct("blend_shape_constraint_values", func(d *decode.D) {
|
|
count := countInfo.blendShapeConstraintValues
|
|
|
|
d.SeekAbs(sectionOffsets.blendShapeConstraintValues.keys * 8)
|
|
fieldAlignedNArray(d, "keys", count, func(d *decode.D) { d.FieldF32("value") })
|
|
|
|
d.SeekAbs(sectionOffsets.blendShapeConstraintValues.weights * 8)
|
|
fieldAlignedNArray(d, "weights", count, func(d *decode.D) { d.FieldF32("value") })
|
|
})
|
|
}
|
|
|
|
if version >= moc3Version5_00_00 {
|
|
d.FieldStruct("blend_shapes_parts", func(d *decode.D) {
|
|
count := countInfo.blendShapesParts
|
|
|
|
d.SeekAbs(sectionOffsets.blendShapesParts.targetIndices * 8)
|
|
fieldAlignedNArray(d, "target_indices", count, func(d *decode.D) { d.FieldS32("index") })
|
|
|
|
d.SeekAbs(sectionOffsets.blendShapesParts.blendShapeKeyformBindingSourcesBeginIndices * 8)
|
|
fieldAlignedNArray(d, "blend_shape_keyform_binding_sources_begin_indices", count, func(d *decode.D) { d.FieldS32("index") })
|
|
|
|
d.SeekAbs(sectionOffsets.blendShapesParts.blendShapeKeyformBindingSourcesCounts * 8)
|
|
fieldAlignedNArray(d, "blend_shape_keyform_binding_sources_counts", count, func(d *decode.D) { d.FieldS32("count") })
|
|
})
|
|
|
|
d.FieldStruct("blend_shapes_rotation_deformers", func(d *decode.D) {
|
|
count := countInfo.blendShapesRotationDeformers
|
|
|
|
d.SeekAbs(sectionOffsets.blendShapesRotationDeformers.targetIndices * 8)
|
|
fieldAlignedNArray(d, "target_indices", count, func(d *decode.D) { d.FieldS32("index") })
|
|
|
|
d.SeekAbs(sectionOffsets.blendShapesRotationDeformers.blendShapeKeyformBindingSourcesBeginIndices * 8)
|
|
fieldAlignedNArray(d, "blend_shape_keyform_binding_sources_begin_indices", count, func(d *decode.D) { d.FieldS32("index") })
|
|
|
|
d.SeekAbs(sectionOffsets.blendShapesRotationDeformers.blendShapeKeyformBindingSourcesCounts * 8)
|
|
fieldAlignedNArray(d, "blend_shape_keyform_binding_sources_counts", count, func(d *decode.D) { d.FieldS32("count") })
|
|
})
|
|
|
|
d.FieldStruct("blend_shapes_glue", func(d *decode.D) {
|
|
count := countInfo.blendShapesGlue
|
|
|
|
d.SeekAbs(sectionOffsets.blendShapesGlue.targetIndices * 8)
|
|
fieldAlignedNArray(d, "target_indices", count, func(d *decode.D) { d.FieldS32("index") })
|
|
|
|
d.SeekAbs(sectionOffsets.blendShapesGlue.blendShapeKeyformBindingSourcesBeginIndices * 8)
|
|
fieldAlignedNArray(d, "blend_shape_keyform_binding_sources_begin_indices", count, func(d *decode.D) { d.FieldS32("index") })
|
|
|
|
d.SeekAbs(sectionOffsets.blendShapesGlue.blendShapeKeyformBindingSourcesCounts * 8)
|
|
fieldAlignedNArray(d, "blend_shape_keyform_binding_sources_counts", count, func(d *decode.D) { d.FieldS32("count") })
|
|
})
|
|
}
|
|
})
|
|
|
|
return nil
|
|
}
|