U5.5 Glasballiste: fünfte Meshy-Figur (g06) als Maschine
Laufende Balliste ohne Arme: statisches Meshy-Modell aus Vorder- und Rückansicht, Skelett und Clips der Phase-19-Figur per Messpunkten angepasst (build_machine.py), starre Bindung mit Knochenbereichen. 54 Credits. Stresstest 36 Glasballisten gegen Phase 19: Mid gleich, Karte 117,8 -> 132,8 fps. Tests grün, Fingerabdrücke unverändert. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
483
Assets/Luneraria/Art/Characters/glasballiste_meshy.export.json
Normal file
|
|
@ -0,0 +1,483 @@
|
|||
{
|
||||
"id": "glasballiste_meshy",
|
||||
"group": "Characters",
|
||||
"source": "tools/meshy/build_machine.py",
|
||||
"exporter_version": 11,
|
||||
"blender": "5.2.2 LTS",
|
||||
"fbx_settings": {
|
||||
"use_selection": true,
|
||||
"use_visible": false,
|
||||
"use_active_collection": false,
|
||||
"global_scale": 1.0,
|
||||
"apply_unit_scale": true,
|
||||
"apply_scale_options": "FBX_SCALE_UNITS",
|
||||
"axis_forward": "Y",
|
||||
"axis_up": "Z",
|
||||
"bake_space_transform": false,
|
||||
"object_types": [
|
||||
"ARMATURE",
|
||||
"EMPTY",
|
||||
"MESH"
|
||||
],
|
||||
"use_mesh_modifiers": true,
|
||||
"use_mesh_modifiers_render": true,
|
||||
"mesh_smooth_type": "OFF",
|
||||
"use_subsurf": false,
|
||||
"use_mesh_edges": false,
|
||||
"use_tspace": false,
|
||||
"use_triangles": false,
|
||||
"colors_type": "LINEAR",
|
||||
"prioritize_active_color": true,
|
||||
"use_custom_props": false,
|
||||
"add_leaf_bones": false,
|
||||
"primary_bone_axis": "Y",
|
||||
"secondary_bone_axis": "X",
|
||||
"use_armature_deform_only": true,
|
||||
"armature_nodetype": "NULL",
|
||||
"bake_anim": true,
|
||||
"bake_anim_use_all_bones": true,
|
||||
"bake_anim_use_nla_strips": false,
|
||||
"bake_anim_use_all_actions": true,
|
||||
"bake_anim_force_startend_keying": true,
|
||||
"bake_anim_step": 1.0,
|
||||
"bake_anim_simplify_factor": 0.0,
|
||||
"path_mode": "STRIP",
|
||||
"embed_textures": false,
|
||||
"batch_mode": "OFF"
|
||||
},
|
||||
"checks": [
|
||||
{
|
||||
"check": "turn_applied",
|
||||
"ok": true,
|
||||
"detail": "[]"
|
||||
},
|
||||
{
|
||||
"check": "units_metric",
|
||||
"ok": true,
|
||||
"detail": "METRIC"
|
||||
},
|
||||
{
|
||||
"check": "unit_scale_1",
|
||||
"ok": true,
|
||||
"detail": "1.0"
|
||||
},
|
||||
{
|
||||
"check": "no_negative_scale",
|
||||
"ok": true,
|
||||
"detail": "{}"
|
||||
},
|
||||
{
|
||||
"check": "object_scale_1",
|
||||
"ok": true,
|
||||
"detail": "{}"
|
||||
},
|
||||
{
|
||||
"check": "mesh_names_unique",
|
||||
"ok": true,
|
||||
"detail": "['Glasballiste_meshyBody_LOD0', 'Glasballiste_meshyBody_LOD1']"
|
||||
},
|
||||
{
|
||||
"check": "material_slots_filled",
|
||||
"ok": true,
|
||||
"detail": "{}"
|
||||
},
|
||||
{
|
||||
"check": "normals_unit_length",
|
||||
"ok": true,
|
||||
"detail": "{}"
|
||||
},
|
||||
{
|
||||
"check": "no_blend_shapes",
|
||||
"ok": true,
|
||||
"detail": "{}"
|
||||
},
|
||||
{
|
||||
"check": "triangles_match_godot",
|
||||
"ok": true,
|
||||
"detail": "25392 fbx / 25392 godot"
|
||||
},
|
||||
{
|
||||
"check": "one_armature",
|
||||
"ok": true,
|
||||
"detail": "['GlassRig']"
|
||||
},
|
||||
{
|
||||
"check": "single_root_bone",
|
||||
"ok": true,
|
||||
"detail": "['Root']"
|
||||
},
|
||||
{
|
||||
"check": "root_bone_name",
|
||||
"ok": true,
|
||||
"detail": "['Root']"
|
||||
},
|
||||
{
|
||||
"check": "bone_count_match_godot",
|
||||
"ok": true,
|
||||
"detail": "20 / 20"
|
||||
},
|
||||
{
|
||||
"check": "bone_names_portable",
|
||||
"ok": true,
|
||||
"detail": "[]"
|
||||
},
|
||||
{
|
||||
"check": "skinned_meshes_present",
|
||||
"ok": true,
|
||||
"detail": ""
|
||||
},
|
||||
{
|
||||
"check": "clips_match_godot",
|
||||
"ok": true,
|
||||
"detail": "[]"
|
||||
},
|
||||
{
|
||||
"check": "required_clips_present",
|
||||
"ok": true,
|
||||
"detail": "[]"
|
||||
},
|
||||
{
|
||||
"check": "roundtrip_mesh_names",
|
||||
"ok": true,
|
||||
"detail": "[]"
|
||||
},
|
||||
{
|
||||
"check": "roundtrip_triangles",
|
||||
"ok": true,
|
||||
"detail": "25392 / 25392"
|
||||
},
|
||||
{
|
||||
"check": "roundtrip_materials",
|
||||
"ok": true,
|
||||
"detail": "[]"
|
||||
},
|
||||
{
|
||||
"check": "roundtrip_bones",
|
||||
"ok": true,
|
||||
"detail": "[]"
|
||||
},
|
||||
{
|
||||
"check": "roundtrip_clips",
|
||||
"ok": true,
|
||||
"detail": "['ability', 'attack_a', 'attack_b', 'death', 'hit', 'idle', 'walk']"
|
||||
}
|
||||
],
|
||||
"generator": {
|
||||
"model_scale": 1.328,
|
||||
"dropped_vertices": 109,
|
||||
"landmarks": {
|
||||
"height": 1.3865,
|
||||
"leg_x": 0.4311,
|
||||
"weapon_z": 1.1316,
|
||||
"tip_y": -1.2943,
|
||||
"back_y": 1.232,
|
||||
"bow_x": 0.9306,
|
||||
"bow_y": 0.0911
|
||||
},
|
||||
"rig_scale": 0.9671,
|
||||
"weights": {
|
||||
"Pelvis": 3922,
|
||||
"Spine": 1159,
|
||||
"Weapon": 9305,
|
||||
"Gear": 823,
|
||||
"Draw": 0,
|
||||
"Bolt": 0,
|
||||
"Quarrel": 284,
|
||||
"Limb.L": 221,
|
||||
"LimbTip.L": 397,
|
||||
"Limb.R": 190,
|
||||
"LimbTip.R": 428,
|
||||
"Thigh.L": 2413,
|
||||
"Shin.L": 2104,
|
||||
"Tarsus.L": 598,
|
||||
"Foot.L": 647,
|
||||
"Thigh.R": 2289,
|
||||
"Shin.R": 2128,
|
||||
"Tarsus.R": 709,
|
||||
"Foot.R": 649
|
||||
},
|
||||
"clips": {
|
||||
"ability": {
|
||||
"seconds": 1.625,
|
||||
"loop": false,
|
||||
"contact_seconds": 0.9
|
||||
},
|
||||
"attack_a": {
|
||||
"seconds": 1.625,
|
||||
"loop": false,
|
||||
"contact_seconds": 0.9
|
||||
},
|
||||
"attack_b": {
|
||||
"seconds": 1.625,
|
||||
"loop": false,
|
||||
"contact_seconds": 0.9
|
||||
},
|
||||
"death": {
|
||||
"seconds": 2.5,
|
||||
"loop": false,
|
||||
"contact_seconds": -1.0
|
||||
},
|
||||
"hit": {
|
||||
"seconds": 0.625,
|
||||
"loop": false,
|
||||
"contact_seconds": -1.0
|
||||
},
|
||||
"idle": {
|
||||
"seconds": 3.75,
|
||||
"loop": true,
|
||||
"contact_seconds": -1.0
|
||||
},
|
||||
"walk": {
|
||||
"seconds": 1.5,
|
||||
"loop": true,
|
||||
"contact_seconds": -1.0
|
||||
}
|
||||
},
|
||||
"textures": {
|
||||
"glow_share": 0.0378,
|
||||
"palette_gains": {
|
||||
"rock": [
|
||||
1.0783,
|
||||
1.3754,
|
||||
2.0359
|
||||
],
|
||||
"metal": [
|
||||
2.9973,
|
||||
2.4461,
|
||||
1.0464
|
||||
]
|
||||
},
|
||||
"size": [
|
||||
2048,
|
||||
2048
|
||||
]
|
||||
},
|
||||
"lod": {
|
||||
"lod0_triangles": 20397,
|
||||
"lod1_triangles": 4995,
|
||||
"lod1_vertices": 2407,
|
||||
"welded_triangles": 20397,
|
||||
"lod0_screen": 0.2
|
||||
}
|
||||
},
|
||||
"inputs_sha256": {
|
||||
"tools/meshy/build_figure.py": "4d5cdab415e4bfa97abe420f7457d4e1cddd67b9a76c23ccb6f9313a2fd8ea4e",
|
||||
"tools/meshy/g06/figure.json": "157eeb4a1737ba23381fdf7665b73756b6a7427b02fe8074a1e15d206d15c81e",
|
||||
"assets-source/meshy/g06/glasballiste-modell.glb": "1e7efc1943c3c622e122f68d9dc954c3ae262a13eed66fecf1c8b26d97bcbb5a",
|
||||
"assets-source/meshy/g06/glasballiste-rig-phase19.blend": "3fae885ac47e031fc6cadd6fb5010774405548eca9a5d96e7e1a4859e7f7d590"
|
||||
},
|
||||
"source_sha256": "e67cdc167c162edddaa8e7d03f92e4574bf1c04ff0bbc60727ca49691e4d0b80",
|
||||
"removed_modifiers": 0,
|
||||
"kind": "skinned",
|
||||
"fps": 24.0,
|
||||
"objects": 3,
|
||||
"meshes": {
|
||||
"Glasballiste_meshyBody_LOD0": {
|
||||
"mesh": "Glasballiste_meshyBody_LOD0",
|
||||
"triangles": 20397,
|
||||
"vertices": 28266,
|
||||
"ngons": 0,
|
||||
"materials": [
|
||||
"AI_Glasballiste"
|
||||
],
|
||||
"uv_layers": [
|
||||
"UVMap"
|
||||
],
|
||||
"color_attributes": [],
|
||||
"active_color": null,
|
||||
"custom_normals": true,
|
||||
"normals_unit_length": true,
|
||||
"bad_normals": 0,
|
||||
"degenerate_triangles": 0,
|
||||
"shape_keys": 0,
|
||||
"skinned": true,
|
||||
"scale": [
|
||||
1.0,
|
||||
1.0,
|
||||
1.0
|
||||
],
|
||||
"bounds_unity": {
|
||||
"min": [
|
||||
-0.9194,
|
||||
0.0,
|
||||
-1.232
|
||||
],
|
||||
"max": [
|
||||
0.9306,
|
||||
1.3865,
|
||||
1.2943
|
||||
]
|
||||
}
|
||||
},
|
||||
"Glasballiste_meshyBody_LOD1": {
|
||||
"mesh": "Glasballiste_meshyBody_LOD1",
|
||||
"triangles": 4995,
|
||||
"vertices": 2407,
|
||||
"ngons": 0,
|
||||
"materials": [
|
||||
"AI_Glasballiste"
|
||||
],
|
||||
"uv_layers": [
|
||||
"UVMap"
|
||||
],
|
||||
"color_attributes": [],
|
||||
"active_color": null,
|
||||
"custom_normals": false,
|
||||
"normals_unit_length": true,
|
||||
"bad_normals": 0,
|
||||
"degenerate_triangles": 0,
|
||||
"shape_keys": 0,
|
||||
"skinned": true,
|
||||
"scale": [
|
||||
1.0,
|
||||
1.0,
|
||||
1.0
|
||||
],
|
||||
"bounds_unity": {
|
||||
"min": [
|
||||
-0.9115,
|
||||
-0.0,
|
||||
-1.2321
|
||||
],
|
||||
"max": [
|
||||
0.9199,
|
||||
1.389,
|
||||
1.2979
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
"armatures": {
|
||||
"GlassRig": {
|
||||
"bones": [
|
||||
"Root",
|
||||
"Pelvis",
|
||||
"Spine",
|
||||
"Weapon",
|
||||
"Gear",
|
||||
"Draw",
|
||||
"Bolt",
|
||||
"Quarrel",
|
||||
"Limb.L",
|
||||
"LimbTip.L",
|
||||
"Limb.R",
|
||||
"LimbTip.R",
|
||||
"Thigh.L",
|
||||
"Shin.L",
|
||||
"Tarsus.L",
|
||||
"Foot.L",
|
||||
"Thigh.R",
|
||||
"Shin.R",
|
||||
"Tarsus.R",
|
||||
"Foot.R"
|
||||
],
|
||||
"roots": [
|
||||
"Root"
|
||||
]
|
||||
}
|
||||
},
|
||||
"empties": {},
|
||||
"bounds_unity": {
|
||||
"min": [
|
||||
-0.9194,
|
||||
-0.0,
|
||||
-1.2321
|
||||
],
|
||||
"max": [
|
||||
0.9306,
|
||||
1.389,
|
||||
1.2979
|
||||
]
|
||||
},
|
||||
"clips": [
|
||||
{
|
||||
"name": "ability",
|
||||
"frames": [
|
||||
0.0,
|
||||
39.0
|
||||
],
|
||||
"seconds": 1.625,
|
||||
"loop": false,
|
||||
"contact_seconds": 0.9
|
||||
},
|
||||
{
|
||||
"name": "attack_a",
|
||||
"frames": [
|
||||
0.0,
|
||||
39.0
|
||||
],
|
||||
"seconds": 1.625,
|
||||
"loop": false,
|
||||
"contact_seconds": 0.9
|
||||
},
|
||||
{
|
||||
"name": "attack_b",
|
||||
"frames": [
|
||||
0.0,
|
||||
39.0
|
||||
],
|
||||
"seconds": 1.625,
|
||||
"loop": false,
|
||||
"contact_seconds": 0.9
|
||||
},
|
||||
{
|
||||
"name": "death",
|
||||
"frames": [
|
||||
0.0,
|
||||
60.0
|
||||
],
|
||||
"seconds": 2.5,
|
||||
"loop": false,
|
||||
"contact_seconds": -1.0
|
||||
},
|
||||
{
|
||||
"name": "hit",
|
||||
"frames": [
|
||||
0.0,
|
||||
15.0
|
||||
],
|
||||
"seconds": 0.625,
|
||||
"loop": false,
|
||||
"contact_seconds": -1.0
|
||||
},
|
||||
{
|
||||
"name": "idle",
|
||||
"frames": [
|
||||
0.0,
|
||||
90.0
|
||||
],
|
||||
"seconds": 3.75,
|
||||
"loop": true,
|
||||
"contact_seconds": -1.0
|
||||
},
|
||||
{
|
||||
"name": "walk",
|
||||
"frames": [
|
||||
0.0,
|
||||
36.0
|
||||
],
|
||||
"seconds": 1.5,
|
||||
"loop": true,
|
||||
"contact_seconds": -1.0
|
||||
}
|
||||
],
|
||||
"expected_from_godot": {
|
||||
"triangles": 25392,
|
||||
"bones": 20,
|
||||
"clips": [
|
||||
"idle",
|
||||
"walk",
|
||||
"attack_a",
|
||||
"attack_b",
|
||||
"hit",
|
||||
"ability",
|
||||
"death"
|
||||
]
|
||||
},
|
||||
"meshes_with_ngons": {},
|
||||
"meshes_without_uv": [],
|
||||
"triangles": 25392,
|
||||
"fbx": "Assets/Luneraria/Art/Characters/glasballiste_meshy.fbx",
|
||||
"fbx_bytes": 2783260,
|
||||
"ok": true
|
||||
}
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
fileFormatVersion: 2
|
||||
guid: fe349e7ea0b7c47219980e6e17195669
|
||||
TextScriptImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
BIN
Assets/Luneraria/Art/Characters/glasballiste_meshy.fbx
Normal file
337
Assets/Luneraria/Art/Characters/glasballiste_meshy.fbx.meta
Normal file
|
|
@ -0,0 +1,337 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 9e7984da72d934624961bf1843a975a2
|
||||
ModelImporter:
|
||||
serializedVersion: 24300
|
||||
internalIDToNameTable: []
|
||||
externalObjects: {}
|
||||
materials:
|
||||
materialImportMode: 2
|
||||
materialName: 0
|
||||
materialSearch: 1
|
||||
materialLocation: 1
|
||||
searchTexturesGlobally: 0
|
||||
animations:
|
||||
legacyGenerateAnimations: 4
|
||||
bakeSimulation: 0
|
||||
resampleCurves: 0
|
||||
optimizeGameObjects: 0
|
||||
removeConstantScaleCurves: 0
|
||||
motionNodeName:
|
||||
animationImportErrors:
|
||||
animationImportWarnings:
|
||||
animationRetargetingWarnings:
|
||||
animationDoRetargetingWarnings: 0
|
||||
importAnimatedCustomProperties: 0
|
||||
importConstraints: 0
|
||||
animationCompression: 0
|
||||
animationRotationError: 0.5
|
||||
animationPositionError: 0.5
|
||||
animationScaleError: 0.5
|
||||
animationWrapMode: 0
|
||||
extraExposedTransformPaths: []
|
||||
extraUserProperties: []
|
||||
clipAnimations:
|
||||
- serializedVersion: 16
|
||||
name: ability
|
||||
takeName: GlassRig|ability
|
||||
internalID: -7919000216198073119
|
||||
firstFrame: 0
|
||||
lastFrame: 39
|
||||
wrapMode: 0
|
||||
orientationOffsetY: 0
|
||||
level: 0
|
||||
cycleOffset: 0
|
||||
loop: 0
|
||||
hasAdditiveReferencePose: 0
|
||||
loopTime: 0
|
||||
loopBlend: 0
|
||||
loopBlendOrientation: 0
|
||||
loopBlendPositionY: 0
|
||||
loopBlendPositionXZ: 0
|
||||
keepOriginalOrientation: 0
|
||||
keepOriginalPositionY: 1
|
||||
keepOriginalPositionXZ: 0
|
||||
heightFromFeet: 0
|
||||
mirror: 0
|
||||
bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000
|
||||
curves: []
|
||||
events:
|
||||
- time: 0.5538462
|
||||
functionName: OnLuneContact
|
||||
data:
|
||||
objectReferenceParameter: {instanceID: 0}
|
||||
floatParameter: 0
|
||||
intParameter: 0
|
||||
messageOptions: 0
|
||||
transformMask: []
|
||||
maskType: 3
|
||||
maskSource: {instanceID: 0}
|
||||
additiveReferencePoseFrame: 0
|
||||
- serializedVersion: 16
|
||||
name: attack_a
|
||||
takeName: GlassRig|attack_a
|
||||
internalID: -1051572861822767423
|
||||
firstFrame: 0
|
||||
lastFrame: 39
|
||||
wrapMode: 0
|
||||
orientationOffsetY: 0
|
||||
level: 0
|
||||
cycleOffset: 0
|
||||
loop: 0
|
||||
hasAdditiveReferencePose: 0
|
||||
loopTime: 0
|
||||
loopBlend: 0
|
||||
loopBlendOrientation: 0
|
||||
loopBlendPositionY: 0
|
||||
loopBlendPositionXZ: 0
|
||||
keepOriginalOrientation: 0
|
||||
keepOriginalPositionY: 1
|
||||
keepOriginalPositionXZ: 0
|
||||
heightFromFeet: 0
|
||||
mirror: 0
|
||||
bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000
|
||||
curves: []
|
||||
events:
|
||||
- time: 0.5538462
|
||||
functionName: OnLuneContact
|
||||
data:
|
||||
objectReferenceParameter: {instanceID: 0}
|
||||
floatParameter: 0
|
||||
intParameter: 0
|
||||
messageOptions: 0
|
||||
transformMask: []
|
||||
maskType: 3
|
||||
maskSource: {instanceID: 0}
|
||||
additiveReferencePoseFrame: 0
|
||||
- serializedVersion: 16
|
||||
name: attack_b
|
||||
takeName: GlassRig|attack_b
|
||||
internalID: -1535081827255962408
|
||||
firstFrame: 0
|
||||
lastFrame: 39
|
||||
wrapMode: 0
|
||||
orientationOffsetY: 0
|
||||
level: 0
|
||||
cycleOffset: 0
|
||||
loop: 0
|
||||
hasAdditiveReferencePose: 0
|
||||
loopTime: 0
|
||||
loopBlend: 0
|
||||
loopBlendOrientation: 0
|
||||
loopBlendPositionY: 0
|
||||
loopBlendPositionXZ: 0
|
||||
keepOriginalOrientation: 0
|
||||
keepOriginalPositionY: 1
|
||||
keepOriginalPositionXZ: 0
|
||||
heightFromFeet: 0
|
||||
mirror: 0
|
||||
bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000
|
||||
curves: []
|
||||
events:
|
||||
- time: 0.5538462
|
||||
functionName: OnLuneContact
|
||||
data:
|
||||
objectReferenceParameter: {instanceID: 0}
|
||||
floatParameter: 0
|
||||
intParameter: 0
|
||||
messageOptions: 0
|
||||
transformMask: []
|
||||
maskType: 3
|
||||
maskSource: {instanceID: 0}
|
||||
additiveReferencePoseFrame: 0
|
||||
- serializedVersion: 16
|
||||
name: death
|
||||
takeName: GlassRig|death
|
||||
internalID: 6753341294469026485
|
||||
firstFrame: 0
|
||||
lastFrame: 60
|
||||
wrapMode: 0
|
||||
orientationOffsetY: 0
|
||||
level: 0
|
||||
cycleOffset: 0
|
||||
loop: 0
|
||||
hasAdditiveReferencePose: 0
|
||||
loopTime: 0
|
||||
loopBlend: 0
|
||||
loopBlendOrientation: 0
|
||||
loopBlendPositionY: 0
|
||||
loopBlendPositionXZ: 0
|
||||
keepOriginalOrientation: 0
|
||||
keepOriginalPositionY: 1
|
||||
keepOriginalPositionXZ: 0
|
||||
heightFromFeet: 0
|
||||
mirror: 0
|
||||
bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000
|
||||
curves: []
|
||||
events: []
|
||||
transformMask: []
|
||||
maskType: 3
|
||||
maskSource: {instanceID: 0}
|
||||
additiveReferencePoseFrame: 0
|
||||
- serializedVersion: 16
|
||||
name: hit
|
||||
takeName: GlassRig|hit
|
||||
internalID: -1323971324642963009
|
||||
firstFrame: 0
|
||||
lastFrame: 15
|
||||
wrapMode: 0
|
||||
orientationOffsetY: 0
|
||||
level: 0
|
||||
cycleOffset: 0
|
||||
loop: 0
|
||||
hasAdditiveReferencePose: 0
|
||||
loopTime: 0
|
||||
loopBlend: 0
|
||||
loopBlendOrientation: 0
|
||||
loopBlendPositionY: 0
|
||||
loopBlendPositionXZ: 0
|
||||
keepOriginalOrientation: 0
|
||||
keepOriginalPositionY: 1
|
||||
keepOriginalPositionXZ: 0
|
||||
heightFromFeet: 0
|
||||
mirror: 0
|
||||
bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000
|
||||
curves: []
|
||||
events: []
|
||||
transformMask: []
|
||||
maskType: 3
|
||||
maskSource: {instanceID: 0}
|
||||
additiveReferencePoseFrame: 0
|
||||
- serializedVersion: 16
|
||||
name: idle
|
||||
takeName: GlassRig|idle
|
||||
internalID: -5892436920300653951
|
||||
firstFrame: 0
|
||||
lastFrame: 90
|
||||
wrapMode: 0
|
||||
orientationOffsetY: 0
|
||||
level: 0
|
||||
cycleOffset: 0
|
||||
loop: 0
|
||||
hasAdditiveReferencePose: 0
|
||||
loopTime: 1
|
||||
loopBlend: 0
|
||||
loopBlendOrientation: 0
|
||||
loopBlendPositionY: 0
|
||||
loopBlendPositionXZ: 0
|
||||
keepOriginalOrientation: 0
|
||||
keepOriginalPositionY: 1
|
||||
keepOriginalPositionXZ: 0
|
||||
heightFromFeet: 0
|
||||
mirror: 0
|
||||
bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000
|
||||
curves: []
|
||||
events: []
|
||||
transformMask: []
|
||||
maskType: 3
|
||||
maskSource: {instanceID: 0}
|
||||
additiveReferencePoseFrame: 0
|
||||
- serializedVersion: 16
|
||||
name: walk
|
||||
takeName: GlassRig|walk
|
||||
internalID: -6071105229449828934
|
||||
firstFrame: 0
|
||||
lastFrame: 36
|
||||
wrapMode: 0
|
||||
orientationOffsetY: 0
|
||||
level: 0
|
||||
cycleOffset: 0
|
||||
loop: 0
|
||||
hasAdditiveReferencePose: 0
|
||||
loopTime: 1
|
||||
loopBlend: 0
|
||||
loopBlendOrientation: 0
|
||||
loopBlendPositionY: 0
|
||||
loopBlendPositionXZ: 0
|
||||
keepOriginalOrientation: 0
|
||||
keepOriginalPositionY: 1
|
||||
keepOriginalPositionXZ: 0
|
||||
heightFromFeet: 0
|
||||
mirror: 0
|
||||
bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000
|
||||
curves: []
|
||||
events: []
|
||||
transformMask: []
|
||||
maskType: 3
|
||||
maskSource: {instanceID: 0}
|
||||
additiveReferencePoseFrame: 0
|
||||
isReadable: 1
|
||||
meshes:
|
||||
lODScreenPercentages:
|
||||
- 0.25
|
||||
- 0.01
|
||||
globalScale: 1
|
||||
meshCompression: 0
|
||||
addColliders: 0
|
||||
useSRGBMaterialColor: 1
|
||||
sortHierarchyByName: 1
|
||||
importPhysicalCameras: 1
|
||||
importVisibility: 0
|
||||
importBlendShapes: 0
|
||||
importCameras: 0
|
||||
importLights: 0
|
||||
nodeNameCollisionStrategy: 1
|
||||
fileIdsGeneration: 2
|
||||
swapUVChannels: 0
|
||||
generateSecondaryUV: 0
|
||||
useFileUnits: 1
|
||||
keepQuads: 0
|
||||
weldVertices: 1
|
||||
bakeAxisConversion: 1
|
||||
preserveHierarchy: 0
|
||||
skinWeightsMode: 0
|
||||
maxBonesPerVertex: 4
|
||||
minBoneWeight: 0.001
|
||||
optimizeBones: 1
|
||||
generateMeshLods: 0
|
||||
meshLodGenerationFlags: 0
|
||||
maximumMeshLod: -1
|
||||
meshOptimizationFlags: -1
|
||||
indexFormat: 0
|
||||
secondaryUVAngleDistortion: 8
|
||||
secondaryUVAreaDistortion: 15.000001
|
||||
secondaryUVHardAngle: 88
|
||||
secondaryUVMarginMethod: 1
|
||||
secondaryUVMinLightmapResolution: 40
|
||||
secondaryUVMinObjectScale: 1
|
||||
secondaryUVPackMargin: 4
|
||||
useFileScale: 1
|
||||
strictVertexDataChecks: 0
|
||||
tangentSpace:
|
||||
normalSmoothAngle: 60
|
||||
normalImportMode: 0
|
||||
tangentImportMode: 3
|
||||
normalCalculationMode: 4
|
||||
legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0
|
||||
blendShapeNormalImportMode: 1
|
||||
normalSmoothingSource: 0
|
||||
referencedClips: []
|
||||
importAnimation: 1
|
||||
humanDescription:
|
||||
serializedVersion: 3
|
||||
human: []
|
||||
skeleton: []
|
||||
armTwist: 0.5
|
||||
foreArmTwist: 0.5
|
||||
upperLegTwist: 0.5
|
||||
legTwist: 0.5
|
||||
armStretch: 0.05
|
||||
legStretch: 0.05
|
||||
feetSpacing: 0
|
||||
globalScale: 1
|
||||
rootMotionBoneName:
|
||||
hasTranslationDoF: 0
|
||||
hasExtraRoot: 0
|
||||
skeletonHasParents: 1
|
||||
lastHumanDescriptionAvatarSource: {instanceID: 0}
|
||||
autoGenerateAvatarMappingIfUnspecified: 1
|
||||
animationType: 2
|
||||
humanoidOversampling: 1
|
||||
avatarSetup: 1
|
||||
addHumanoidExtraRootOnlyWhenUsingAvatar: 1
|
||||
importBlendShapeDeformPercent: 1
|
||||
remapMaterialsIfMaterialImportModeIsNone: 0
|
||||
additionalBone: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
246
Assets/Luneraria/Art/Generated/glasballiste_meshy.controller
Normal file
|
|
@ -0,0 +1,246 @@
|
|||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!1102 &-8434174874543606591
|
||||
AnimatorState:
|
||||
serializedVersion: 6
|
||||
m_ObjectHideFlags: 1
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: hit
|
||||
m_Speed: 1
|
||||
m_CycleOffset: 0
|
||||
m_Transitions: []
|
||||
m_StateMachineBehaviours: []
|
||||
m_Position: {x: 50, y: 50, z: 0}
|
||||
m_IKOnFeet: 0
|
||||
m_WriteDefaultValues: 1
|
||||
m_Mirror: 0
|
||||
m_SpeedParameterActive: 0
|
||||
m_MirrorParameterActive: 0
|
||||
m_CycleOffsetParameterActive: 0
|
||||
m_TimeParameterActive: 0
|
||||
m_Motion: {fileID: -1323971324642963009, guid: 9e7984da72d934624961bf1843a975a2, type: 3}
|
||||
m_Tag:
|
||||
m_SpeedParameter:
|
||||
m_MirrorParameter:
|
||||
m_CycleOffsetParameter:
|
||||
m_TimeParameter:
|
||||
--- !u!1102 &-5416665121308761972
|
||||
AnimatorState:
|
||||
serializedVersion: 6
|
||||
m_ObjectHideFlags: 1
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: death
|
||||
m_Speed: 1
|
||||
m_CycleOffset: 0
|
||||
m_Transitions: []
|
||||
m_StateMachineBehaviours: []
|
||||
m_Position: {x: 50, y: 50, z: 0}
|
||||
m_IKOnFeet: 0
|
||||
m_WriteDefaultValues: 1
|
||||
m_Mirror: 0
|
||||
m_SpeedParameterActive: 0
|
||||
m_MirrorParameterActive: 0
|
||||
m_CycleOffsetParameterActive: 0
|
||||
m_TimeParameterActive: 0
|
||||
m_Motion: {fileID: 6753341294469026485, guid: 9e7984da72d934624961bf1843a975a2, type: 3}
|
||||
m_Tag:
|
||||
m_SpeedParameter:
|
||||
m_MirrorParameter:
|
||||
m_CycleOffsetParameter:
|
||||
m_TimeParameter:
|
||||
--- !u!1102 &-4260744790244769963
|
||||
AnimatorState:
|
||||
serializedVersion: 6
|
||||
m_ObjectHideFlags: 1
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: idle
|
||||
m_Speed: 1
|
||||
m_CycleOffset: 0
|
||||
m_Transitions: []
|
||||
m_StateMachineBehaviours: []
|
||||
m_Position: {x: 50, y: 50, z: 0}
|
||||
m_IKOnFeet: 0
|
||||
m_WriteDefaultValues: 1
|
||||
m_Mirror: 0
|
||||
m_SpeedParameterActive: 0
|
||||
m_MirrorParameterActive: 0
|
||||
m_CycleOffsetParameterActive: 0
|
||||
m_TimeParameterActive: 0
|
||||
m_Motion: {fileID: -5892436920300653951, guid: 9e7984da72d934624961bf1843a975a2, type: 3}
|
||||
m_Tag:
|
||||
m_SpeedParameter:
|
||||
m_MirrorParameter:
|
||||
m_CycleOffsetParameter:
|
||||
m_TimeParameter:
|
||||
--- !u!1102 &-3361320582081102081
|
||||
AnimatorState:
|
||||
serializedVersion: 6
|
||||
m_ObjectHideFlags: 1
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: walk
|
||||
m_Speed: 1
|
||||
m_CycleOffset: 0
|
||||
m_Transitions: []
|
||||
m_StateMachineBehaviours: []
|
||||
m_Position: {x: 50, y: 50, z: 0}
|
||||
m_IKOnFeet: 0
|
||||
m_WriteDefaultValues: 1
|
||||
m_Mirror: 0
|
||||
m_SpeedParameterActive: 0
|
||||
m_MirrorParameterActive: 0
|
||||
m_CycleOffsetParameterActive: 0
|
||||
m_TimeParameterActive: 0
|
||||
m_Motion: {fileID: -6071105229449828934, guid: 9e7984da72d934624961bf1843a975a2, type: 3}
|
||||
m_Tag:
|
||||
m_SpeedParameter:
|
||||
m_MirrorParameter:
|
||||
m_CycleOffsetParameter:
|
||||
m_TimeParameter:
|
||||
--- !u!1102 &-1474364994158733830
|
||||
AnimatorState:
|
||||
serializedVersion: 6
|
||||
m_ObjectHideFlags: 1
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: ability
|
||||
m_Speed: 1
|
||||
m_CycleOffset: 0
|
||||
m_Transitions: []
|
||||
m_StateMachineBehaviours: []
|
||||
m_Position: {x: 50, y: 50, z: 0}
|
||||
m_IKOnFeet: 0
|
||||
m_WriteDefaultValues: 1
|
||||
m_Mirror: 0
|
||||
m_SpeedParameterActive: 0
|
||||
m_MirrorParameterActive: 0
|
||||
m_CycleOffsetParameterActive: 0
|
||||
m_TimeParameterActive: 0
|
||||
m_Motion: {fileID: -7919000216198073119, guid: 9e7984da72d934624961bf1843a975a2, type: 3}
|
||||
m_Tag:
|
||||
m_SpeedParameter:
|
||||
m_MirrorParameter:
|
||||
m_CycleOffsetParameter:
|
||||
m_TimeParameter:
|
||||
--- !u!91 &9100000
|
||||
AnimatorController:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: glasballiste_meshy
|
||||
serializedVersion: 5
|
||||
m_AnimatorParameters: []
|
||||
m_AnimatorLayers:
|
||||
- serializedVersion: 5
|
||||
m_Name: Base Layer
|
||||
m_StateMachine: {fileID: 6678967435774485364}
|
||||
m_Mask: {fileID: 0}
|
||||
m_Motions: []
|
||||
m_Behaviours: []
|
||||
m_BlendingMode: 0
|
||||
m_SyncedLayerIndex: -1
|
||||
m_DefaultWeight: 0
|
||||
m_IKPass: 0
|
||||
m_SyncedLayerAffectsTiming: 0
|
||||
m_Controller: {fileID: 9100000}
|
||||
--- !u!1107 &6678967435774485364
|
||||
AnimatorStateMachine:
|
||||
serializedVersion: 6
|
||||
m_ObjectHideFlags: 1
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: Base Layer
|
||||
m_ChildStates:
|
||||
- serializedVersion: 1
|
||||
m_State: {fileID: -4260744790244769963}
|
||||
m_Position: {x: 200, y: 0, z: 0}
|
||||
- serializedVersion: 1
|
||||
m_State: {fileID: -1474364994158733830}
|
||||
m_Position: {x: 235, y: 65, z: 0}
|
||||
- serializedVersion: 1
|
||||
m_State: {fileID: 8349891135191072166}
|
||||
m_Position: {x: 270, y: 130, z: 0}
|
||||
- serializedVersion: 1
|
||||
m_State: {fileID: 8556350901143709154}
|
||||
m_Position: {x: 305, y: 195, z: 0}
|
||||
- serializedVersion: 1
|
||||
m_State: {fileID: -5416665121308761972}
|
||||
m_Position: {x: 340, y: 260, z: 0}
|
||||
- serializedVersion: 1
|
||||
m_State: {fileID: -8434174874543606591}
|
||||
m_Position: {x: 375, y: 325, z: 0}
|
||||
- serializedVersion: 1
|
||||
m_State: {fileID: -3361320582081102081}
|
||||
m_Position: {x: 410, y: 390, z: 0}
|
||||
m_ChildStateMachines: []
|
||||
m_AnyStateTransitions: []
|
||||
m_EntryTransitions: []
|
||||
m_StateMachineTransitions: {}
|
||||
m_StateMachineBehaviours: []
|
||||
m_AnyStatePosition: {x: 50, y: 20, z: 0}
|
||||
m_EntryPosition: {x: 50, y: 120, z: 0}
|
||||
m_ExitPosition: {x: 800, y: 120, z: 0}
|
||||
m_ParentStateMachinePosition: {x: 800, y: 20, z: 0}
|
||||
m_DefaultState: {fileID: -4260744790244769963}
|
||||
--- !u!1102 &8349891135191072166
|
||||
AnimatorState:
|
||||
serializedVersion: 6
|
||||
m_ObjectHideFlags: 1
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: attack_a
|
||||
m_Speed: 1
|
||||
m_CycleOffset: 0
|
||||
m_Transitions: []
|
||||
m_StateMachineBehaviours: []
|
||||
m_Position: {x: 50, y: 50, z: 0}
|
||||
m_IKOnFeet: 0
|
||||
m_WriteDefaultValues: 1
|
||||
m_Mirror: 0
|
||||
m_SpeedParameterActive: 0
|
||||
m_MirrorParameterActive: 0
|
||||
m_CycleOffsetParameterActive: 0
|
||||
m_TimeParameterActive: 0
|
||||
m_Motion: {fileID: -1051572861822767423, guid: 9e7984da72d934624961bf1843a975a2, type: 3}
|
||||
m_Tag:
|
||||
m_SpeedParameter:
|
||||
m_MirrorParameter:
|
||||
m_CycleOffsetParameter:
|
||||
m_TimeParameter:
|
||||
--- !u!1102 &8556350901143709154
|
||||
AnimatorState:
|
||||
serializedVersion: 6
|
||||
m_ObjectHideFlags: 1
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: attack_b
|
||||
m_Speed: 1
|
||||
m_CycleOffset: 0
|
||||
m_Transitions: []
|
||||
m_StateMachineBehaviours: []
|
||||
m_Position: {x: 50, y: 50, z: 0}
|
||||
m_IKOnFeet: 0
|
||||
m_WriteDefaultValues: 1
|
||||
m_Mirror: 0
|
||||
m_SpeedParameterActive: 0
|
||||
m_MirrorParameterActive: 0
|
||||
m_CycleOffsetParameterActive: 0
|
||||
m_TimeParameterActive: 0
|
||||
m_Motion: {fileID: -1535081827255962408, guid: 9e7984da72d934624961bf1843a975a2, type: 3}
|
||||
m_Tag:
|
||||
m_SpeedParameter:
|
||||
m_MirrorParameter:
|
||||
m_CycleOffsetParameter:
|
||||
m_TimeParameter:
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 333e60f0eb4384e86b5fd3f2a5242bcd
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 9100000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
BIN
Assets/Luneraria/Art/Textures/ai-glasballiste-albedo-2k.png
Normal file
|
After Width: | Height: | Size: 7 MiB |
117
Assets/Luneraria/Art/Textures/ai-glasballiste-albedo-2k.png.meta
Normal file
|
|
@ -0,0 +1,117 @@
|
|||
fileFormatVersion: 2
|
||||
guid: d3918a260b8da400da94395eb45d325f
|
||||
TextureImporter:
|
||||
internalIDToNameTable: []
|
||||
externalObjects: {}
|
||||
serializedVersion: 13
|
||||
mipmaps:
|
||||
mipMapMode: 0
|
||||
enableMipMap: 1
|
||||
sRGBTexture: 1
|
||||
linearTexture: 0
|
||||
fadeOut: 0
|
||||
borderMipMap: 0
|
||||
mipMapsPreserveCoverage: 0
|
||||
alphaTestReferenceValue: 0.5
|
||||
mipMapFadeDistanceStart: 1
|
||||
mipMapFadeDistanceEnd: 3
|
||||
bumpmap:
|
||||
convertToNormalMap: 0
|
||||
externalNormalMap: 0
|
||||
heightScale: 0.25
|
||||
normalMapFilter: 0
|
||||
flipGreenChannel: 0
|
||||
isReadable: 0
|
||||
streamingMipmaps: 0
|
||||
streamingMipmapsPriority: 0
|
||||
vTOnly: 0
|
||||
ignoreMipmapLimit: 0
|
||||
grayScaleToAlpha: 0
|
||||
generateCubemap: 6
|
||||
cubemapConvolution: 0
|
||||
seamlessCubemap: 0
|
||||
textureFormat: 1
|
||||
maxTextureSize: 2048
|
||||
textureSettings:
|
||||
serializedVersion: 2
|
||||
filterMode: 1
|
||||
aniso: 1
|
||||
mipBias: 0
|
||||
wrapU: 0
|
||||
wrapV: 0
|
||||
wrapW: 0
|
||||
nPOTScale: 1
|
||||
lightmap: 0
|
||||
compressionQuality: 50
|
||||
spriteMode: 0
|
||||
spriteExtrude: 1
|
||||
spriteMeshType: 1
|
||||
alignment: 0
|
||||
spritePivot: {x: 0.5, y: 0.5}
|
||||
spritePixelsToUnits: 100
|
||||
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
|
||||
spriteGenerateFallbackPhysicsShape: 1
|
||||
alphaUsage: 1
|
||||
alphaIsTransparency: 0
|
||||
spriteTessellationDetail: -1
|
||||
textureType: 0
|
||||
textureShape: 1
|
||||
singleChannelComponent: 0
|
||||
flipbookRows: 1
|
||||
flipbookColumns: 1
|
||||
maxTextureSizeSet: 0
|
||||
compressionQualitySet: 0
|
||||
textureFormatSet: 0
|
||||
ignorePngGamma: 0
|
||||
applyGammaDecoding: 0
|
||||
swizzle: 50462976
|
||||
cookieLightType: 0
|
||||
platformSettings:
|
||||
- serializedVersion: 4
|
||||
buildTarget: DefaultTexturePlatform
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 4
|
||||
buildTarget: Standalone
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
spriteSheet:
|
||||
serializedVersion: 2
|
||||
sprites: []
|
||||
outline: []
|
||||
customData:
|
||||
physicsShape: []
|
||||
bones: []
|
||||
spriteID:
|
||||
internalID: 0
|
||||
vertices: []
|
||||
indices:
|
||||
edges: []
|
||||
weights: []
|
||||
secondaryTextures: []
|
||||
spriteCustomMetadata:
|
||||
entries: []
|
||||
nameFileIdTable: {}
|
||||
mipmapLimitGroupName:
|
||||
pSDRemoveMatte: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
BIN
Assets/Luneraria/Art/Textures/ai-glasballiste-normal-2k.png
Normal file
|
After Width: | Height: | Size: 5.8 MiB |
117
Assets/Luneraria/Art/Textures/ai-glasballiste-normal-2k.png.meta
Normal file
|
|
@ -0,0 +1,117 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 1b6d8107d63f548b5952190966c9829b
|
||||
TextureImporter:
|
||||
internalIDToNameTable: []
|
||||
externalObjects: {}
|
||||
serializedVersion: 13
|
||||
mipmaps:
|
||||
mipMapMode: 0
|
||||
enableMipMap: 1
|
||||
sRGBTexture: 0
|
||||
linearTexture: 0
|
||||
fadeOut: 0
|
||||
borderMipMap: 0
|
||||
mipMapsPreserveCoverage: 0
|
||||
alphaTestReferenceValue: 0.5
|
||||
mipMapFadeDistanceStart: 1
|
||||
mipMapFadeDistanceEnd: 3
|
||||
bumpmap:
|
||||
convertToNormalMap: 0
|
||||
externalNormalMap: 0
|
||||
heightScale: 0.25
|
||||
normalMapFilter: 0
|
||||
flipGreenChannel: 0
|
||||
isReadable: 0
|
||||
streamingMipmaps: 0
|
||||
streamingMipmapsPriority: 0
|
||||
vTOnly: 0
|
||||
ignoreMipmapLimit: 0
|
||||
grayScaleToAlpha: 0
|
||||
generateCubemap: 6
|
||||
cubemapConvolution: 0
|
||||
seamlessCubemap: 0
|
||||
textureFormat: 1
|
||||
maxTextureSize: 2048
|
||||
textureSettings:
|
||||
serializedVersion: 2
|
||||
filterMode: 1
|
||||
aniso: 1
|
||||
mipBias: 0
|
||||
wrapU: 0
|
||||
wrapV: 0
|
||||
wrapW: 0
|
||||
nPOTScale: 1
|
||||
lightmap: 0
|
||||
compressionQuality: 50
|
||||
spriteMode: 0
|
||||
spriteExtrude: 1
|
||||
spriteMeshType: 1
|
||||
alignment: 0
|
||||
spritePivot: {x: 0.5, y: 0.5}
|
||||
spritePixelsToUnits: 100
|
||||
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
|
||||
spriteGenerateFallbackPhysicsShape: 1
|
||||
alphaUsage: 1
|
||||
alphaIsTransparency: 0
|
||||
spriteTessellationDetail: -1
|
||||
textureType: 1
|
||||
textureShape: 1
|
||||
singleChannelComponent: 0
|
||||
flipbookRows: 1
|
||||
flipbookColumns: 1
|
||||
maxTextureSizeSet: 0
|
||||
compressionQualitySet: 0
|
||||
textureFormatSet: 0
|
||||
ignorePngGamma: 0
|
||||
applyGammaDecoding: 0
|
||||
swizzle: 50462976
|
||||
cookieLightType: 0
|
||||
platformSettings:
|
||||
- serializedVersion: 4
|
||||
buildTarget: DefaultTexturePlatform
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 4
|
||||
buildTarget: Standalone
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
spriteSheet:
|
||||
serializedVersion: 2
|
||||
sprites: []
|
||||
outline: []
|
||||
customData:
|
||||
physicsShape: []
|
||||
bones: []
|
||||
spriteID:
|
||||
internalID: 0
|
||||
vertices: []
|
||||
indices:
|
||||
edges: []
|
||||
weights: []
|
||||
secondaryTextures: []
|
||||
spriteCustomMetadata:
|
||||
entries: []
|
||||
nameFileIdTable: {}
|
||||
mipmapLimitGroupName:
|
||||
pSDRemoveMatte: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
BIN
Assets/Luneraria/Art/Textures/ai-glasballiste-orm-2k.png
Normal file
|
After Width: | Height: | Size: 4 MiB |
117
Assets/Luneraria/Art/Textures/ai-glasballiste-orm-2k.png.meta
Normal file
|
|
@ -0,0 +1,117 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 5d7be9c6dcc0a439383fab7541bed3b0
|
||||
TextureImporter:
|
||||
internalIDToNameTable: []
|
||||
externalObjects: {}
|
||||
serializedVersion: 13
|
||||
mipmaps:
|
||||
mipMapMode: 0
|
||||
enableMipMap: 1
|
||||
sRGBTexture: 0
|
||||
linearTexture: 0
|
||||
fadeOut: 0
|
||||
borderMipMap: 0
|
||||
mipMapsPreserveCoverage: 0
|
||||
alphaTestReferenceValue: 0.5
|
||||
mipMapFadeDistanceStart: 1
|
||||
mipMapFadeDistanceEnd: 3
|
||||
bumpmap:
|
||||
convertToNormalMap: 0
|
||||
externalNormalMap: 0
|
||||
heightScale: 0.25
|
||||
normalMapFilter: 0
|
||||
flipGreenChannel: 0
|
||||
isReadable: 0
|
||||
streamingMipmaps: 0
|
||||
streamingMipmapsPriority: 0
|
||||
vTOnly: 0
|
||||
ignoreMipmapLimit: 0
|
||||
grayScaleToAlpha: 0
|
||||
generateCubemap: 6
|
||||
cubemapConvolution: 0
|
||||
seamlessCubemap: 0
|
||||
textureFormat: 1
|
||||
maxTextureSize: 2048
|
||||
textureSettings:
|
||||
serializedVersion: 2
|
||||
filterMode: 1
|
||||
aniso: 1
|
||||
mipBias: 0
|
||||
wrapU: 0
|
||||
wrapV: 0
|
||||
wrapW: 0
|
||||
nPOTScale: 1
|
||||
lightmap: 0
|
||||
compressionQuality: 50
|
||||
spriteMode: 0
|
||||
spriteExtrude: 1
|
||||
spriteMeshType: 1
|
||||
alignment: 0
|
||||
spritePivot: {x: 0.5, y: 0.5}
|
||||
spritePixelsToUnits: 100
|
||||
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
|
||||
spriteGenerateFallbackPhysicsShape: 1
|
||||
alphaUsage: 1
|
||||
alphaIsTransparency: 0
|
||||
spriteTessellationDetail: -1
|
||||
textureType: 0
|
||||
textureShape: 1
|
||||
singleChannelComponent: 0
|
||||
flipbookRows: 1
|
||||
flipbookColumns: 1
|
||||
maxTextureSizeSet: 0
|
||||
compressionQualitySet: 0
|
||||
textureFormatSet: 0
|
||||
ignorePngGamma: 0
|
||||
applyGammaDecoding: 0
|
||||
swizzle: 50462976
|
||||
cookieLightType: 0
|
||||
platformSettings:
|
||||
- serializedVersion: 4
|
||||
buildTarget: DefaultTexturePlatform
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 4
|
||||
buildTarget: Standalone
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
spriteSheet:
|
||||
serializedVersion: 2
|
||||
sprites: []
|
||||
outline: []
|
||||
customData:
|
||||
physicsShape: []
|
||||
bones: []
|
||||
spriteID:
|
||||
internalID: 0
|
||||
vertices: []
|
||||
indices:
|
||||
edges: []
|
||||
weights: []
|
||||
secondaryTextures: []
|
||||
spriteCustomMetadata:
|
||||
entries: []
|
||||
nameFileIdTable: {}
|
||||
mipmapLimitGroupName:
|
||||
pSDRemoveMatte: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
|
|
@ -189,6 +189,10 @@ MonoBehaviour:
|
|||
Neutral: {fileID: 2100000, guid: 3e39141c45e974506afc4dc46f6b2ac2, type: 2}
|
||||
Blau: {fileID: 0}
|
||||
Rot: {fileID: 0}
|
||||
- Key: AI_Glasballiste
|
||||
Neutral: {fileID: 2100000, guid: 3457f10507e8a47008df03877c11698c, type: 2}
|
||||
Blau: {fileID: 0}
|
||||
Rot: {fileID: 0}
|
||||
- Key: AI_Kohlenbeisser
|
||||
Neutral: {fileID: 2100000, guid: 19529a85bbe534478a40059f9505d897, type: 2}
|
||||
Blau: {fileID: 0}
|
||||
|
|
|
|||
68
Assets/Luneraria/Materials/Units/AI_Glasballiste.mat
Normal file
|
|
@ -0,0 +1,68 @@
|
|||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!21 &2100000
|
||||
Material:
|
||||
serializedVersion: 8
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: AI_Glasballiste
|
||||
m_Shader: {fileID: 4800000, guid: 9809bd5750e264586bd30e14a6f1bd4e, type: 3}
|
||||
m_Parent: {fileID: 0}
|
||||
m_ModifiedSerializedProperties: 0
|
||||
m_ValidKeywords: []
|
||||
m_InvalidKeywords: []
|
||||
m_LightmapFlags: 0
|
||||
m_EnableInstancingVariants: 1
|
||||
m_DoubleSidedGI: 0
|
||||
m_CustomRenderQueue: -1
|
||||
stringTagMap: {}
|
||||
disabledShaderPasses: []
|
||||
m_LockedProperties:
|
||||
m_SavedProperties:
|
||||
serializedVersion: 3
|
||||
m_TexEnvs:
|
||||
- _AlbedoMap:
|
||||
m_Texture: {fileID: 2800000, guid: d3918a260b8da400da94395eb45d325f, type: 3}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _NormalMap:
|
||||
m_Texture: {fileID: 2800000, guid: 1b6d8107d63f548b5952190966c9829b, type: 3}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _OrmMap:
|
||||
m_Texture: {fileID: 2800000, guid: 5d7be9c6dcc0a439383fab7541bed3b0, type: 3}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _StoneMap:
|
||||
m_Texture: {fileID: 2800000, guid: 2e11a30a0df8143ab84722ec0a116b6d, type: 3}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
m_Ints: []
|
||||
m_Floats:
|
||||
- _Cull: 2
|
||||
- _Energy: 1
|
||||
- _Flicker: 0
|
||||
- _Glow: 1.25
|
||||
- _Metallic: 1
|
||||
- _Mode: 0
|
||||
- _NormalStrength: 1
|
||||
- _ObjectSpace: 0
|
||||
- _Quality: 1
|
||||
- _Relief: 0.016
|
||||
- _Rim: 0.35
|
||||
- _Roughness: 1
|
||||
- _Seed: 0
|
||||
- _ShadowNormalScale: 0
|
||||
- _StoneScale: 1
|
||||
- _UvMaps: 1
|
||||
- _VertexColor: 0
|
||||
m_Colors:
|
||||
- _AlbedoMean: {r: 1, g: 1, b: 1, a: 1}
|
||||
- _BaseColor: {r: 1, g: 1, b: 1, a: 1}
|
||||
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
|
||||
- _OrmMean: {r: 1, g: 1, b: 1, a: 1}
|
||||
- _RimColor: {r: 0.8, g: 0.86, b: 1, a: 1}
|
||||
m_BuildTextureStacks: []
|
||||
m_AllowLocking: 1
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 3457f10507e8a47008df03877c11698c
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 2100000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
|
|
@ -71,8 +71,8 @@ MonoBehaviour:
|
|||
Prefab: {fileID: 919132149155446097, guid: 70c39c469a6fa406f85b60c8407d95c9, type: 3}
|
||||
Controller: {fileID: 9100000, guid: 44426d34820fe40da91e59336999b8a9, type: 2}
|
||||
- Id: g06
|
||||
Prefab: {fileID: 919132149155446097, guid: 71588361ff1ed4a72a13d46d2f3753be, type: 3}
|
||||
Controller: {fileID: 9100000, guid: 25806d20be161460284fa5cd0affc84b, type: 2}
|
||||
Prefab: {fileID: 919132149155446097, guid: 9e7984da72d934624961bf1843a975a2, type: 3}
|
||||
Controller: {fileID: 9100000, guid: 333e60f0eb4384e86b5fd3f2a5242bcd, type: 2}
|
||||
- Id: g07
|
||||
Prefab: {fileID: 919132149155446097, guid: 5398b8b548d5944fca073f9319c68bf6, type: 3}
|
||||
Controller: {fileID: 0}
|
||||
|
|
@ -88,6 +88,9 @@ MonoBehaviour:
|
|||
- Id: glasballiste
|
||||
Prefab: {fileID: 919132149155446097, guid: 71588361ff1ed4a72a13d46d2f3753be, type: 3}
|
||||
Controller: {fileID: 9100000, guid: 25806d20be161460284fa5cd0affc84b, type: 2}
|
||||
- Id: glasballiste_meshy
|
||||
Prefab: {fileID: 919132149155446097, guid: 9e7984da72d934624961bf1843a975a2, type: 3}
|
||||
Controller: {fileID: 9100000, guid: 333e60f0eb4384e86b5fd3f2a5242bcd, type: 2}
|
||||
- Id: kohlenbeisser
|
||||
Prefab: {fileID: 919132149155446097, guid: cb652a88669c64f4d98a351c01bf9642, type: 3}
|
||||
Controller: {fileID: 9100000, guid: 26a63e3ffbfe94d109316067e70ea293, type: 2}
|
||||
|
|
|
|||
BIN
assets-source/meshy/g06/glasballiste-konzept-hinten.png
Normal file
|
After Width: | Height: | Size: 248 KiB |
BIN
assets-source/meshy/g06/glasballiste-konzept-vorn.png
Normal file
|
After Width: | Height: | Size: 254 KiB |
BIN
assets-source/meshy/g06/glasballiste-konzept.png
Normal file
|
After Width: | Height: | Size: 1.3 MiB |
BIN
assets-source/meshy/g06/glasballiste-modell.glb
Normal file
BIN
assets-source/meshy/g06/glasballiste-rig-phase19.blend
Normal file
|
|
@ -174,6 +174,17 @@ Hinweis: Die Projektdateien des .NET-Harness (`tools/dotnet/*/*.csproj`) fehlten
|
|||
| Bild | `screenshots/u5.5-g05/` |
|
||||
| Commits | `luneraria/u5.5-g05` |
|
||||
|
||||
## U5.5 · Glasballiste (g06)
|
||||
|
||||
| Punkt | Ergebnis |
|
||||
| --- | --- |
|
||||
| Tests | EditMode 29/29, PlayMode 14/14 (Verify A–I 718/0), Player-Selbsttest 30/30, Asset-Prüfung 20/0 |
|
||||
| Parität | Fingerabdrücke unverändert (`DCE95C96556F3A1A`, `7B8E43AEFC0D60C5`) |
|
||||
| Inhalt | Statisches Meshy-Modell mit dem angepassten Phase-19-Skelett und seinen Clips (`build_machine.py`), starre Bindung, 54 Credits |
|
||||
| Leistung | Stresstest 36 Glasballisten gegen Phase 19: Mid 150,4 → 151,4 fps, Karte 117,8 → 132,8 fps. Rohdaten `logs/u5.5-g06/` |
|
||||
| Bild | `screenshots/u5.5-g06/` |
|
||||
| Commits | `luneraria/u5.5-g06` |
|
||||
|
||||
## Ausblick
|
||||
|
||||
Der Pilot entscheidet über eine Serie weiterer Meshy-Figuren (Kosten je Figur, Lizenz, Stilgleichheit). Offen bleiben außerdem Künstler-Sculpts für Anatomie/Gesicht/Haar, LOD und Material-Atlanten sowie die Build-Module für Windows und Linux.
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
# Port-Status · Champions of Luneraria in Unity
|
||||
|
||||
Stand: 10. Oktober 2026 (U5.5, vierte Figur).
|
||||
Stand: 10. Oktober 2026 (U5.5, fünfte Figur).
|
||||
|
||||
Referenz ist der Godot-Stand `luneraria/g3` (`1b540f2`) in `../saumwacht-godot`; er wird nicht mehr verändert. Engine: Unity 6.3 LTS (6000.3.20f1), Renderer URP. HDRP ist ausgeschlossen, bis ein Vergleich mit einer echten Szene etwas anderes nahelegt.
|
||||
|
||||
|
|
@ -13,7 +13,7 @@ Zielplattformen sind Fedora 44 und Windows 11; macOS ist die Entwicklungsplattfo
|
|||
| U2 · Unity-Spielwelt | **fertig**: U2A Blender→FBX-Pipeline (9 Assets geprüft), U2B G1-Karte mit Materialsystem, U2C fester Takt und Ansichten (bildratenunabhängig nachgewiesen), U2D vollständige Bot-Partien sichtbar und gleich dem Kern; danach Batch-Import aller 86 Modelle, Einheiten mit eigenen Modellen | [U2-WORLD.md](U2-WORLD.md) |
|
||||
| U3 · G3-HUD portieren | **fertig** (`luneraria/u3`): UI Toolkit, Sichtmodell mit Privatsphäre, menschlicher Sitz, alle HUD-Bereiche, Eingabe und Befehle, Prüfung 718/0, 14 G3-Motive, Spieltest, Leistung mit HUD | [U3-UI.md](U3-UI.md) |
|
||||
| U4 · Netzwerk | **fertig** (`luneraria/u4` = `769e622`): LuneSession (Protokoll 4), TCP-Transport, Startbildschirm Host/Join, 43+12 Prüfungen, Mindestumfang M4. Nachtrag (`luneraria/u4-nachtrag`, in U5.3 zusammengeführt): Startbildschirm in der Szene, „Menü“ führt dorthin zurück | [U4-NETWORK.md](U4-NETWORK.md) |
|
||||
| U5 · Visuelle Neuausrichtung (Vertical Slice Mid-Lane) | **fertig** (`luneraria/u5` = `2c1686b`, Stufen `luneraria/u5.2`): 6 PBR-Sätze, Surface-Shader mit Albedo/Normal/ORM, Stufen Lane/Rand, Hit- und Turm-VFX, 133/180 fps. **U5.3** (`luneraria/u5.3` = `07fa457`): Gebäude, Boss und Ringborkes Rinde auf PBR (11 Sätze); Bildfehler aus U5 behoben (doppelte Einfärbung, Datenkarten als sRGB, Streifen, bleichender Treffer-Flash, Nebel), Helligkeit und Grün wieder auf U3-Niveau **U5.4** (`luneraria/u5.4` = `4883d95`): Surface-Materialien für alle 146 Figurenmaterialien (Metalle metallisch, Randlicht, Struktur in den Porträts), SSAO (abschaltbar), Leistung −13 % Karte / −16 % Mid **U5.5-pilot** (`luneraria/u5.5-pilot` = `c386206`): Meshy-Figur für den Kohlenbeißer `g01` (Pipeline `tools/meshy/`, UV-Material mit Lava-Glut, Schatten ohne Normalen-Versatz), GPU-Batched-Skinning, Figuren-Stress −21 % Mid / −13 % Karte gegenüber Phase-4; **Lane-Fassung** (`luneraria/u5.5-lod`): 5.000-Dreiecke-LOD, Abstand −10 % Mid / −2 % Karte; **Schlackenklaue** `g02` (`luneraria/u5.5-g02`) als zweite Meshy-Figur, −11 % Mid / −1 % Karte; **Schlackenwacht** `g03` (`luneraria/u5.5-g03`), −8 % Mid / 0 % Karte; **Funkenlanze** `g05` mit Lanze als eigenem Modell (`luneraria/u5.5-g05`), +15 % gegenüber der Phase-18-Figur | [U5-VISUAL.md](U5-VISUAL.md) |
|
||||
| U5 · Visuelle Neuausrichtung (Vertical Slice Mid-Lane) | **fertig** (`luneraria/u5` = `2c1686b`, Stufen `luneraria/u5.2`): 6 PBR-Sätze, Surface-Shader mit Albedo/Normal/ORM, Stufen Lane/Rand, Hit- und Turm-VFX, 133/180 fps. **U5.3** (`luneraria/u5.3` = `07fa457`): Gebäude, Boss und Ringborkes Rinde auf PBR (11 Sätze); Bildfehler aus U5 behoben (doppelte Einfärbung, Datenkarten als sRGB, Streifen, bleichender Treffer-Flash, Nebel), Helligkeit und Grün wieder auf U3-Niveau **U5.4** (`luneraria/u5.4` = `4883d95`): Surface-Materialien für alle 146 Figurenmaterialien (Metalle metallisch, Randlicht, Struktur in den Porträts), SSAO (abschaltbar), Leistung −13 % Karte / −16 % Mid **U5.5-pilot** (`luneraria/u5.5-pilot` = `c386206`): Meshy-Figur für den Kohlenbeißer `g01` (Pipeline `tools/meshy/`, UV-Material mit Lava-Glut, Schatten ohne Normalen-Versatz), GPU-Batched-Skinning, Figuren-Stress −21 % Mid / −13 % Karte gegenüber Phase-4; **Lane-Fassung** (`luneraria/u5.5-lod`): 5.000-Dreiecke-LOD, Abstand −10 % Mid / −2 % Karte; **Schlackenklaue** `g02` (`luneraria/u5.5-g02`) als zweite Meshy-Figur, −11 % Mid / −1 % Karte; **Schlackenwacht** `g03` (`luneraria/u5.5-g03`), −8 % Mid / 0 % Karte; **Funkenlanze** `g05` mit Lanze als eigenem Modell (`luneraria/u5.5-g05`), +15 % gegenüber der Phase-18-Figur; **Glasballiste** `g06` als Maschine mit übernommenem Skelett (`luneraria/u5.5-g06`) | [U5-VISUAL.md](U5-VISUAL.md) |
|
||||
|
||||
QA je Meilenstein: [PORT-QA.md](PORT-QA.md).
|
||||
|
||||
|
|
|
|||
|
|
@ -536,3 +536,35 @@ Stresstest mit 38 Funkenlanzen (`-luneBenchmarkArmy g05`), je drei Läufe (`logs
|
|||
Die Meshy-Figur ist hier schneller: Die Phase-18-Figur hat 24.000 Dreiecke ohne Lane-Fassung.
|
||||
|
||||
Bilder: `screenshots/u5.5-g05/` (Figur, vorher/nachher im Spiel, Übersichten, Kampfmomente).
|
||||
|
||||
## U5.5 · Fünfte Figur: Glasballiste (g06)
|
||||
|
||||
Stand 10. Oktober 2026, Zweig `luneraria/u5.5-g06` (auf `luneraria/u5.5-g05`). Die Aufwertung der Funkenlanze ist eine laufende Balliste: zwei Klauenbeine, der Rumpf eine große Armbrust mit Kristallbögen, keine Arme und kein Kopf. Meshys Auto-Rigging nimmt nur menschenähnliche Figuren; die Glasballiste kommt deshalb als statisches Meshy-Modell und bekommt Skelett und Bewegungen der Phase-19-Figur, die sie ersetzt.
|
||||
|
||||
### Neuer Weg: `tools/meshy/build_machine.py`
|
||||
|
||||
- **Modell:** Konzeptbild (12 Credits), daraus Ansichten von vorn und hinten (12), Multi-Image to 3D (30): **54 Credits**. Die Seitenansicht deutete die Armbrust anders und blieb deshalb weg. Meshy ließ eine lose Kristallspitze neben der Figur; Teile unter 1 % der Eckpunkte werden entfernt.
|
||||
- **Skelett und Clips:** `GlassRig` mit 20 Knochen und den sieben Bewegungen der Phase-19-Figur, aus der Godot-Quelle in `assets-source/meshy/g06/glasballiste-rig-phase19.blend` übernommen (nur Skelett und Aktionen). Der Generator setzt jede Knochengruppe auf den passenden Teil des neuen Modells: Beine auf Beinabstand und Hüfthöhe, Armbrust auf Waffenhöhe, Bolzenspitze und Schaftende, Bögen auf die Bogenspitzen (Messpunkte aus dem Netz). Die Verschiebungen der Clips folgen dem Maßstab (0,97).
|
||||
- **Starre Bindung:** Jede Ecke folgt ihrem nächsten Knochen, wie bei einer Maschine aus festen Teilen. Bereiche je Knochen (`bone_regions`) verhindern, dass die lange Schienenachse den ganzen Schaft mitnimmt: Bolzen nur vorn, die Sehnenführung (`Draw`) bewegt nichts.
|
||||
- Breite 1,85 m wie bisher; das neue Modell ist mit 2,5 m deutlich länger als die Phase-19-Figur (1,6 m), in der Aufstellung überlappen die Schäfte.
|
||||
|
||||
`glasballiste_meshy.fbx`: 20.397 + 4.995 Dreiecke, 20 Knochen; Export 23 Prüfungen, bytegleich wiederholbar. Manifest `"replaces": "g06"`.
|
||||
|
||||
### Prüfung
|
||||
|
||||
| Test | Ergebnis |
|
||||
| --- | --- |
|
||||
| EditMode / PlayMode | 29/29, 14/14, Verify A–I 718/0 |
|
||||
| Fingerabdrücke | `DCE95C96556F3A1A`, `7B8E43AEFC0D60C5`, unverändert |
|
||||
| Asset-Prüfung / Player-Selbsttest | 20/0, 30/30 |
|
||||
|
||||
### Leistung
|
||||
|
||||
Stresstest mit 36 Glasballisten (`-luneBenchmarkArmy g06`), je drei Läufe, gegen die Phase-19-Figur (`logs/u5.5-g06/`): Mid-Lane nah 150,4 → 151,4 fps (gleich), Karte 117,8 → 132,8 fps (+13 %).
|
||||
|
||||
### Grenzen
|
||||
|
||||
- Die Bewegungen sind die der alten Figur; Gangbild und Schuss passen, sind aber für deren Proportionen gemacht.
|
||||
- Starre Bindung auf einem durchgehenden Netz: Wo zwei Knochen aneinanderstoßen, reißen bei großen Ausschlägen (Sterbeclip, Bögen) kleine Lücken auf.
|
||||
|
||||
Bilder: `screenshots/u5.5-g06/` (Figur, vorher/nachher im Spiel, Übersichten, Kampfmomente).
|
||||
|
|
|
|||
|
|
@ -1487,6 +1487,173 @@
|
|||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "glasballiste_meshy",
|
||||
"kind": "skinned",
|
||||
"ok": true,
|
||||
"checks": [
|
||||
{
|
||||
"check": "blender_checks_passed",
|
||||
"ok": true,
|
||||
"detail": ""
|
||||
},
|
||||
{
|
||||
"check": "imported",
|
||||
"ok": true,
|
||||
"detail": "\"Assets/Luneraria/Art/Characters/glasballiste_meshy.fbx\""
|
||||
},
|
||||
{
|
||||
"check": "import_rules_applied",
|
||||
"ok": true,
|
||||
"detail": ""
|
||||
},
|
||||
{
|
||||
"check": "root_transform_identity",
|
||||
"ok": true,
|
||||
"detail": "\"glasballiste_meshy pos (0.0000, 0.0000, 0.0000) rot (0.00, 0.00, 0.00) scale (1.0000, 1.0000, 1.0000)\""
|
||||
},
|
||||
{
|
||||
"check": "node_transforms_axis_clean",
|
||||
"ok": true,
|
||||
"detail": "[]"
|
||||
},
|
||||
{
|
||||
"check": "mesh_names",
|
||||
"ok": true,
|
||||
"detail": "[]"
|
||||
},
|
||||
{
|
||||
"check": "triangles",
|
||||
"ok": true,
|
||||
"detail": "\"25392 unity / 25392 blender \""
|
||||
},
|
||||
{
|
||||
"check": "material_slots",
|
||||
"ok": true,
|
||||
"detail": "[]"
|
||||
},
|
||||
{
|
||||
"check": "normals_unit_length",
|
||||
"ok": true,
|
||||
"detail": "[]"
|
||||
},
|
||||
{
|
||||
"check": "tangents_where_uv",
|
||||
"ok": true,
|
||||
"detail": "[]"
|
||||
},
|
||||
{
|
||||
"check": "uvs_where_blender_has_uv",
|
||||
"ok": true,
|
||||
"detail": "[]"
|
||||
},
|
||||
{
|
||||
"check": "vertex_colors",
|
||||
"ok": true,
|
||||
"detail": "[]"
|
||||
},
|
||||
{
|
||||
"check": "bounds_axes_scale",
|
||||
"ok": true,
|
||||
"detail": "\"largest difference 0.00003 m; unity (-0.919, 0.000, -1.232) (0.931, 1.389, 1.298)\""
|
||||
},
|
||||
{
|
||||
"check": "skinned_mesh",
|
||||
"ok": true,
|
||||
"detail": "2"
|
||||
},
|
||||
{
|
||||
"check": "bone_names Glasballiste_meshyBody_LOD0",
|
||||
"ok": true,
|
||||
"detail": "[]"
|
||||
},
|
||||
{
|
||||
"check": "root_bone Glasballiste_meshyBody_LOD0",
|
||||
"ok": true,
|
||||
"detail": "\"Root\""
|
||||
},
|
||||
{
|
||||
"check": "bone_names Glasballiste_meshyBody_LOD1",
|
||||
"ok": true,
|
||||
"detail": "[]"
|
||||
},
|
||||
{
|
||||
"check": "root_bone Glasballiste_meshyBody_LOD1",
|
||||
"ok": true,
|
||||
"detail": "\"Root\""
|
||||
},
|
||||
{
|
||||
"check": "generic_avatar",
|
||||
"ok": true,
|
||||
"detail": "\"glasballiste_meshyAvatar\""
|
||||
},
|
||||
{
|
||||
"check": "clips",
|
||||
"ok": true,
|
||||
"detail": "[]"
|
||||
}
|
||||
],
|
||||
"facts": {
|
||||
"triangles": 25392,
|
||||
"renderers": 2,
|
||||
"meshes_without_uv_and_tangents": 0,
|
||||
"degenerate_triangles_dropped": 0,
|
||||
"bounds_min": [
|
||||
-0.9193895,
|
||||
-2.81888861E-05,
|
||||
-1.23211074
|
||||
],
|
||||
"bounds_max": [
|
||||
0.930610538,
|
||||
1.38899112,
|
||||
1.29790878
|
||||
],
|
||||
"clips": [
|
||||
{
|
||||
"name": "ability",
|
||||
"length": 1.625,
|
||||
"loop": false,
|
||||
"events": 1
|
||||
},
|
||||
{
|
||||
"name": "attack_a",
|
||||
"length": 1.625,
|
||||
"loop": false,
|
||||
"events": 1
|
||||
},
|
||||
{
|
||||
"name": "attack_b",
|
||||
"length": 1.625,
|
||||
"loop": false,
|
||||
"events": 1
|
||||
},
|
||||
{
|
||||
"name": "death",
|
||||
"length": 2.5,
|
||||
"loop": false,
|
||||
"events": 0
|
||||
},
|
||||
{
|
||||
"name": "hit",
|
||||
"length": 0.625,
|
||||
"loop": false,
|
||||
"events": 0
|
||||
},
|
||||
{
|
||||
"name": "idle",
|
||||
"length": 3.75,
|
||||
"loop": true,
|
||||
"events": 0
|
||||
},
|
||||
{
|
||||
"name": "walk",
|
||||
"length": 1.5,
|
||||
"loop": true,
|
||||
"events": 0
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "kohlenbeisser",
|
||||
"kind": "skinned",
|
||||
|
|
|
|||
|
|
@ -0,0 +1,15 @@
|
|||
{
|
||||
"build": "OSXPlayer player, 6000.3.20f1, release",
|
||||
"device": "Mac17,2; Apple M5; Apple M5",
|
||||
"graphics_api": "Metal",
|
||||
"resolution": "1920x1080",
|
||||
"vsync": 0,
|
||||
"match": "seed 9 from round 5, army g06 x36, speed 1x, measured after 10 s of combat",
|
||||
// moving units at the start of the first window: g06 36, w04 14, e04 11, w06 11, w02 7, e01 4, e02 4, w08 4, w10 4, g05 2
|
||||
"windows": [
|
||||
{"view": "overview (zoom 64)", "frames": 2639, "fps": 131.8, "frame_ms_avg": 7.59, "frame_ms_median": 3.18, "frame_ms_p95": 24.10, "frame_ms_p99": 31.50, "frame_ms_max": 43.00, "frames_over_16_7_ms": 396, "of_them_with_simulation_step": 31, "gc_collections": 20, "simulation_ms_per_frame": 0.072, "views_ms_per_frame": 0.215, "ui_ms_per_frame": 0.068, "units_alive_max": 97},
|
||||
// timings overview (zoom 64): main thread avg 2.53 / median 2.40 / p95 3.59 ms, render thread avg 1.83 / median 1.80 / p95 2.16 ms, gpu avg 0.00 / median 0.00 / p95 0.00 ms, present wait avg 5.05 / median 0.28 / p95 21.66 ms
|
||||
{"view": "mid lane close (zoom 22)", "frames": 1496, "fps": 149.6, "frame_ms_avg": 6.68, "frame_ms_median": 3.03, "frame_ms_p95": 23.43, "frame_ms_p99": 33.51, "frame_ms_max": 40.01, "frames_over_16_7_ms": 165, "of_them_with_simulation_step": 13, "gc_collections": 7, "simulation_ms_per_frame": 0.032, "views_ms_per_frame": 0.187, "ui_ms_per_frame": 0.045, "units_alive_max": 34}
|
||||
// timings mid lane close (zoom 22): main thread avg 1.92 / median 1.86 / p95 2.78 ms, render thread avg 1.30 / median 1.29 / p95 1.51 ms, gpu avg 0.00 / median 0.00 / p95 0.00 ms, present wait avg 4.76 / median 0.67 / p95 21.43 ms
|
||||
]
|
||||
}
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
{
|
||||
"build": "OSXPlayer player, 6000.3.20f1, release",
|
||||
"device": "Mac17,2; Apple M5; Apple M5",
|
||||
"graphics_api": "Metal",
|
||||
"resolution": "1920x1080",
|
||||
"vsync": 0,
|
||||
"match": "seed 9 from round 5, army g06 x36, speed 1x, measured after 10 s of combat",
|
||||
// moving units at the start of the first window: g06 36, w04 14, e04 11, w06 11, w02 7, e01 4, e02 4, w08 4, w10 4, g05 2
|
||||
"windows": [
|
||||
{"view": "overview (zoom 64)", "frames": 2690, "fps": 134.5, "frame_ms_avg": 7.44, "frame_ms_median": 3.09, "frame_ms_p95": 23.80, "frame_ms_p99": 30.01, "frame_ms_max": 42.01, "frames_over_16_7_ms": 382, "of_them_with_simulation_step": 30, "gc_collections": 20, "simulation_ms_per_frame": 0.070, "views_ms_per_frame": 0.206, "ui_ms_per_frame": 0.063, "units_alive_max": 97},
|
||||
// timings overview (zoom 64): main thread avg 2.43 / median 2.32 / p95 3.39 ms, render thread avg 1.78 / median 1.76 / p95 2.06 ms, gpu avg 0.00 / median 0.00 / p95 0.00 ms, present wait avg 5.01 / median 0.30 / p95 21.32 ms
|
||||
{"view": "mid lane close (zoom 22)", "frames": 1543, "fps": 154.3, "frame_ms_avg": 6.48, "frame_ms_median": 2.70, "frame_ms_p95": 21.80, "frame_ms_p99": 29.99, "frame_ms_max": 38.31, "frames_over_16_7_ms": 148, "of_them_with_simulation_step": 7, "gc_collections": 8, "simulation_ms_per_frame": 0.031, "views_ms_per_frame": 0.182, "ui_ms_per_frame": 0.043, "units_alive_max": 34}
|
||||
// timings mid lane close (zoom 22): main thread avg 1.86 / median 1.79 / p95 2.59 ms, render thread avg 1.30 / median 1.29 / p95 1.52 ms, gpu avg 0.00 / median 0.00 / p95 0.00 ms, present wait avg 4.63 / median 0.41 / p95 20.00 ms
|
||||
]
|
||||
}
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
{
|
||||
"build": "OSXPlayer player, 6000.3.20f1, release",
|
||||
"device": "Mac17,2; Apple M5; Apple M5",
|
||||
"graphics_api": "Metal",
|
||||
"resolution": "1920x1080",
|
||||
"vsync": 0,
|
||||
"match": "seed 9 from round 5, army g06 x36, speed 1x, measured after 10 s of combat",
|
||||
// moving units at the start of the first window: g06 36, w04 14, e04 11, w06 11, w02 7, e01 4, e02 4, w08 4, w10 4, g05 2
|
||||
"windows": [
|
||||
{"view": "overview (zoom 64)", "frames": 2646, "fps": 132.2, "frame_ms_avg": 7.56, "frame_ms_median": 3.20, "frame_ms_p95": 24.11, "frame_ms_p99": 31.02, "frame_ms_max": 41.80, "frames_over_16_7_ms": 379, "of_them_with_simulation_step": 33, "gc_collections": 20, "simulation_ms_per_frame": 0.074, "views_ms_per_frame": 0.216, "ui_ms_per_frame": 0.070, "units_alive_max": 97},
|
||||
// timings overview (zoom 64): main thread avg 2.60 / median 2.42 / p95 3.89 ms, render thread avg 1.85 / median 1.83 / p95 2.19 ms, gpu avg 0.00 / median 0.00 / p95 0.00 ms, present wait avg 4.96 / median 0.28 / p95 21.51 ms
|
||||
{"view": "mid lane close (zoom 22)", "frames": 1503, "fps": 150.3, "frame_ms_avg": 6.66, "frame_ms_median": 2.89, "frame_ms_p95": 23.39, "frame_ms_p99": 32.91, "frame_ms_max": 39.10, "frames_over_16_7_ms": 155, "of_them_with_simulation_step": 12, "gc_collections": 7, "simulation_ms_per_frame": 0.028, "views_ms_per_frame": 0.186, "ui_ms_per_frame": 0.047, "units_alive_max": 34}
|
||||
// timings mid lane close (zoom 22): main thread avg 1.90 / median 1.81 / p95 2.70 ms, render thread avg 1.29 / median 1.28 / p95 1.54 ms, gpu avg 0.00 / median 0.00 / p95 0.00 ms, present wait avg 4.76 / median 0.63 / p95 21.34 ms
|
||||
]
|
||||
}
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
{
|
||||
"build": "OSXPlayer player, 6000.3.20f1, release",
|
||||
"device": "Mac17,2; Apple M5; Apple M5",
|
||||
"graphics_api": "Metal",
|
||||
"resolution": "1920x1080",
|
||||
"vsync": 0,
|
||||
"match": "seed 9 from round 5, army g06 x36, speed 1x, measured after 10 s of combat",
|
||||
// moving units at the start of the first window: g06 36, w04 14, e04 11, w06 11, w02 7, e01 4, e02 4, w08 4, w10 4, g05 2
|
||||
"windows": [
|
||||
{"view": "overview (zoom 64)", "frames": 2378, "fps": 118.8, "frame_ms_avg": 8.42, "frame_ms_median": 3.40, "frame_ms_p95": 25.30, "frame_ms_p99": 31.60, "frame_ms_max": 43.33, "frames_over_16_7_ms": 453, "of_them_with_simulation_step": 40, "gc_collections": 21, "simulation_ms_per_frame": 0.078, "views_ms_per_frame": 0.223, "ui_ms_per_frame": 0.071, "units_alive_max": 97},
|
||||
// timings overview (zoom 64): main thread avg 2.70 / median 2.58 / p95 3.68 ms, render thread avg 2.29 / median 2.28 / p95 2.75 ms, gpu avg 0.00 / median 0.00 / p95 0.00 ms, present wait avg 5.70 / median 0.57 / p95 22.46 ms
|
||||
{"view": "mid lane close (zoom 22)", "frames": 1521, "fps": 151.9, "frame_ms_avg": 6.58, "frame_ms_median": 2.70, "frame_ms_p95": 22.62, "frame_ms_p99": 29.11, "frame_ms_max": 36.51, "frames_over_16_7_ms": 167, "of_them_with_simulation_step": 6, "gc_collections": 7, "simulation_ms_per_frame": 0.031, "views_ms_per_frame": 0.184, "ui_ms_per_frame": 0.041, "units_alive_max": 34}
|
||||
// timings mid lane close (zoom 22): main thread avg 1.94 / median 1.88 / p95 2.69 ms, render thread avg 1.60 / median 1.59 / p95 1.87 ms, gpu avg 0.00 / median 0.00 / p95 0.00 ms, present wait avg 4.65 / median 0.42 / p95 20.31 ms
|
||||
]
|
||||
}
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
{
|
||||
"build": "OSXPlayer player, 6000.3.20f1, release",
|
||||
"device": "Mac17,2; Apple M5; Apple M5",
|
||||
"graphics_api": "Metal",
|
||||
"resolution": "1920x1080",
|
||||
"vsync": 0,
|
||||
"match": "seed 9 from round 5, army g06 x36, speed 1x, measured after 10 s of combat",
|
||||
// moving units at the start of the first window: g06 36, w04 14, e04 11, w06 11, w02 7, e01 4, e02 4, w08 4, w10 4, g05 2
|
||||
"windows": [
|
||||
{"view": "overview (zoom 64)", "frames": 2343, "fps": 117.1, "frame_ms_avg": 8.54, "frame_ms_median": 3.51, "frame_ms_p95": 24.80, "frame_ms_p99": 32.21, "frame_ms_max": 42.30, "frames_over_16_7_ms": 413, "of_them_with_simulation_step": 46, "gc_collections": 20, "simulation_ms_per_frame": 0.078, "views_ms_per_frame": 0.229, "ui_ms_per_frame": 0.073, "units_alive_max": 97},
|
||||
// timings overview (zoom 64): main thread avg 2.75 / median 2.62 / p95 3.80 ms, render thread avg 2.30 / median 2.29 / p95 2.74 ms, gpu avg 0.00 / median 0.00 / p95 0.00 ms, present wait avg 5.78 / median 0.57 / p95 21.82 ms
|
||||
{"view": "mid lane close (zoom 22)", "frames": 1499, "fps": 149.9, "frame_ms_avg": 6.67, "frame_ms_median": 2.84, "frame_ms_p95": 22.90, "frame_ms_p99": 32.09, "frame_ms_max": 38.90, "frames_over_16_7_ms": 163, "of_them_with_simulation_step": 9, "gc_collections": 7, "simulation_ms_per_frame": 0.031, "views_ms_per_frame": 0.188, "ui_ms_per_frame": 0.044, "units_alive_max": 34}
|
||||
// timings mid lane close (zoom 22): main thread avg 2.00 / median 1.88 / p95 2.87 ms, render thread avg 1.61 / median 1.59 / p95 1.86 ms, gpu avg 0.00 / median 0.00 / p95 0.00 ms, present wait avg 4.68 / median 0.41 / p95 20.99 ms
|
||||
]
|
||||
}
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
{
|
||||
"build": "OSXPlayer player, 6000.3.20f1, release",
|
||||
"device": "Mac17,2; Apple M5; Apple M5",
|
||||
"graphics_api": "Metal",
|
||||
"resolution": "1920x1080",
|
||||
"vsync": 0,
|
||||
"match": "seed 9 from round 5, army g06 x36, speed 1x, measured after 10 s of combat",
|
||||
// moving units at the start of the first window: g06 36, w04 14, e04 11, w06 11, w02 7, e01 4, e02 4, w08 4, w10 4, g05 2
|
||||
"windows": [
|
||||
{"view": "overview (zoom 64)", "frames": 2350, "fps": 117.4, "frame_ms_avg": 8.52, "frame_ms_median": 3.48, "frame_ms_p95": 24.50, "frame_ms_p99": 32.01, "frame_ms_max": 46.97, "frames_over_16_7_ms": 439, "of_them_with_simulation_step": 32, "gc_collections": 20, "simulation_ms_per_frame": 0.079, "views_ms_per_frame": 0.227, "ui_ms_per_frame": 0.074, "units_alive_max": 97},
|
||||
// timings overview (zoom 64): main thread avg 2.75 / median 2.61 / p95 3.81 ms, render thread avg 2.29 / median 2.28 / p95 2.72 ms, gpu avg 0.00 / median 0.00 / p95 0.00 ms, present wait avg 5.76 / median 0.51 / p95 21.69 ms
|
||||
{"view": "mid lane close (zoom 22)", "frames": 1496, "fps": 149.4, "frame_ms_avg": 6.69, "frame_ms_median": 2.70, "frame_ms_p95": 21.62, "frame_ms_p99": 29.21, "frame_ms_max": 35.91, "frames_over_16_7_ms": 158, "of_them_with_simulation_step": 11, "gc_collections": 7, "simulation_ms_per_frame": 0.031, "views_ms_per_frame": 0.185, "ui_ms_per_frame": 0.043, "units_alive_max": 34}
|
||||
// timings mid lane close (zoom 22): main thread avg 1.95 / median 1.88 / p95 2.65 ms, render thread avg 1.61 / median 1.60 / p95 1.86 ms, gpu avg 0.00 / median 0.00 / p95 0.00 ms, present wait avg 4.74 / median 0.45 / p95 19.56 ms
|
||||
]
|
||||
}
|
||||
11
docs/port/logs/u5.5-g06/player-smoke.json
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
{
|
||||
"build": "OSXPlayer player, 6000.3.20f1, release",
|
||||
"device": "Mac17,2; Apple M5; Apple M5",
|
||||
"graphics_api": "Metal",
|
||||
"resolution": "1920x1080",
|
||||
"seconds": 11.6,
|
||||
"passed": ["Startbildschirm sichtbar", "Partie wartet: Spielcontroller und Treiber aus", "vor dem Start kein HUD", "„Allein spielen“ bedienbar", "Offline: Startbildschirm verborgen", "Offline: Spielcontroller und Treiber laufen", "Offline: HUD sichtbar", "Offline: neue Partie, Sitz 1 (Mid)", "Offline: Planung", "Offline: lokale Sitzung", "„Startaufstellung“ bedienbar", "Startaufstellung gekauft (3 Einheiten)", "„Bereit“ bedienbar", "Bereit: Kampf beginnt", "Kampf: Figuren im Feld", "„Menü“ bedienbar", "Verlassen-Dialog mit „Zum Menü“", "Zurück: Startbildschirm sichtbar", "Zurück: HUD verborgen", "Zurück: Spielcontroller und Treiber aus", "Zurück: Sitzung beendet", "Zurück: keine Figuren im Feld", "Zurück: Kamera ruht", "Zurück: „Allein spielen“ bedienbar", "Zweite Partie: Startbildschirm verborgen, HUD sichtbar", "Zweite Partie: neue Partie in der Planung", "SSAO folgt der Einstellung", "Option „Umgebungsverdeckung“ sichtbar", "Option schaltet SSAO um", "Option stellt SSAO zurück"],
|
||||
"failed": [],
|
||||
"photos": ["00-startbildschirm.jpg", "01-planung.jpg", "02-kampf.jpg", "03-verlassen.jpg", "04-zurueck-im-startbildschirm.jpg", "05-zweite-partie.jpg", "06-optionen.jpg"],
|
||||
"result": "PASS"
|
||||
}
|
||||
11
docs/port/logs/u5.5-g06/scene-frame-rates.json
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
{
|
||||
"match": "seed 2, bots, speed 24x",
|
||||
"core_hash": "DCE95C96556F3A1A",
|
||||
"core_steps": 12690,
|
||||
"runs": [
|
||||
{"target": "30 fps", "frames": 812, "seconds": 27.202, "measured_fps": 29.851, "max_steps_per_frame": 84, "steps": 12690, "hash": "DCE95C96556F3A1A", "winner": 1, "same_as_core": true},
|
||||
{"target": "60 fps", "frames": 1626, "seconds": 27.087, "measured_fps": 60.03, "max_steps_per_frame": 11, "steps": 12690, "hash": "DCE95C96556F3A1A", "winner": 1, "same_as_core": true},
|
||||
{"target": "120 fps", "frames": 3224, "seconds": 26.902, "measured_fps": 119.842, "max_steps_per_frame": 7, "steps": 12690, "hash": "DCE95C96556F3A1A", "winner": 1, "same_as_core": true},
|
||||
{"target": "unlimited", "frames": 87265, "seconds": 26.819, "measured_fps": 3253.892, "max_steps_per_frame": 6, "steps": 12690, "hash": "DCE95C96556F3A1A", "winner": 1, "same_as_core": true}
|
||||
]
|
||||
}
|
||||
16
docs/port/logs/u5.5-g06/vertical-function-test.json
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
{
|
||||
"runs": [
|
||||
{"label": "match-seed2", "seed": 2, "start_round": 1, "extra_gold": 0, "speed": 6, "winner": 1, "end_note": "Ancient von Blau zerstört.", "steps": 12690, "hash": "DCE95C96556F3A1A", "core_hash": "DCE95C96556F3A1A", "same_as_core": true,
|
||||
"units_alive_max": 84, "heroes_alive_max": 4, "boss_log": ["round 8: won team 1 ", "round 9: deployed team 1 bot"],
|
||||
"rounds": [{"round": 1, "combat_seconds": 44.9, "lost": [], "boss": "none", "end": "cleared"}, {"round": 2, "combat_seconds": 57.1, "lost": [], "boss": "none", "end": "cleared"}, {"round": 3, "combat_seconds": 54.1, "lost": [], "boss": "none", "end": "cleared"}, {"round": 4, "combat_seconds": 62.9, "lost": [], "boss": "none", "end": "cleared"}, {"round": 5, "combat_seconds": 60.7, "lost": [], "boss": "none", "end": "cleared"}, {"round": 6, "combat_seconds": 62.1, "lost": [], "boss": "none", "end": "cleared"}, {"round": 7, "combat_seconds": 66.5, "lost": ["blau_bot_outer"], "boss": "none", "end": "cleared"}, {"round": 8, "combat_seconds": 89.65, "lost": ["rot_top_outer", "rot_top_inner"], "boss": "won", "end": "cleared"}, {"round": 9, "combat_seconds": 136.55, "lost": ["blau_bot_inner", "blau_base_2", "blau_base_1", "blau_ancient"], "boss": "deployed", "end": "core"}],
|
||||
"events": ["round 7: blau_bot_outer destroyed", "round 8: rot_top_outer destroyed", "round 8: rot_top_inner destroyed", "round 8: grotto boss won", "round 9: blau_bot_inner destroyed", "round 9: blau_base_2 destroyed", "round 9: blau_base_1 destroyed", "round 9: blau_ancient destroyed", "round 9: grotto boss deployed"],
|
||||
"shots": ["01-runde1-aufmarsch", "02-runde1-mid-kampf", "03-turm-faellt", "04-turm-ruine", "05-grotte-bosskampf", "06-held-kaempft", "07-boss-auf-der-lane", "08-ancient-faellt", "09-ancient-ruine", "10-ende-uebersicht"],
|
||||
"performance": null},
|
||||
{"label": "match-seed9-round21", "seed": 9, "start_round": 21, "extra_gold": 4000, "speed": 6, "winner": 0, "end_note": "Ancient von Rot zerstört.", "steps": 4195, "hash": "7B8E43AEFC0D60C5", "core_hash": "7B8E43AEFC0D60C5", "same_as_core": true,
|
||||
"units_alive_max": 125, "heroes_alive_max": 6, "boss_log": [],
|
||||
"rounds": [{"round": 21, "combat_seconds": 121.8, "lost": ["rot_mid_outer", "rot_top_outer", "rot_mid_inner"], "boss": "none", "end": "cleared"}, {"round": 22, "combat_seconds": 87.95, "lost": ["rot_top_inner", "rot_base_1", "blau_bot_outer", "rot_base_2", "rot_ancient"], "boss": "none", "end": "core"}],
|
||||
"events": ["round 21: rot_mid_outer destroyed", "round 21: rot_top_outer destroyed", "round 21: rot_mid_inner destroyed", "round 22: rot_top_inner destroyed", "round 22: rot_base_1 destroyed", "round 22: blau_bot_outer destroyed", "round 22: rot_base_2 destroyed", "round 22: rot_ancient destroyed"],
|
||||
"shots": ["11-welle21-uebersicht", "12-welle21-kampf", "13-ancient-rot-faellt", "14-welle-ende"],
|
||||
"performance": {"window": "20 s real time at 1x speed, unlimited frame rate, round 21", "frames": 51897, "fps": 2594.81, "frame_ms_avg": 0.385, "frame_ms_p95": 0.417, "simulation_ms_per_frame": 0.004, "views_ms_per_frame": 0.126, "units_alive_max": 116}}
|
||||
]
|
||||
}
|
||||
BIN
docs/port/screenshots/u5.5-g06/01-runde1-aufmarsch.jpg
Normal file
|
After Width: | Height: | Size: 595 KiB |
BIN
docs/port/screenshots/u5.5-g06/02-runde1-mid-kampf.jpg
Normal file
|
After Width: | Height: | Size: 609 KiB |
BIN
docs/port/screenshots/u5.5-g06/03-turm-faellt.jpg
Normal file
|
After Width: | Height: | Size: 544 KiB |
BIN
docs/port/screenshots/u5.5-g06/04-turm-ruine.jpg
Normal file
|
After Width: | Height: | Size: 535 KiB |
BIN
docs/port/screenshots/u5.5-g06/05-grotte-bosskampf.jpg
Normal file
|
After Width: | Height: | Size: 608 KiB |
BIN
docs/port/screenshots/u5.5-g06/06-held-kaempft.jpg
Normal file
|
After Width: | Height: | Size: 625 KiB |
BIN
docs/port/screenshots/u5.5-g06/07-boss-auf-der-lane.jpg
Normal file
|
After Width: | Height: | Size: 578 KiB |
BIN
docs/port/screenshots/u5.5-g06/08-ancient-faellt.jpg
Normal file
|
After Width: | Height: | Size: 624 KiB |
BIN
docs/port/screenshots/u5.5-g06/09-ancient-ruine.jpg
Normal file
|
After Width: | Height: | Size: 623 KiB |
BIN
docs/port/screenshots/u5.5-g06/10-ende-uebersicht.jpg
Normal file
|
After Width: | Height: | Size: 435 KiB |
BIN
docs/port/screenshots/u5.5-g06/11-welle21-uebersicht.jpg
Normal file
|
After Width: | Height: | Size: 592 KiB |
BIN
docs/port/screenshots/u5.5-g06/12-welle21-kampf.jpg
Normal file
|
After Width: | Height: | Size: 649 KiB |
BIN
docs/port/screenshots/u5.5-g06/13-ancient-rot-faellt.jpg
Normal file
|
After Width: | Height: | Size: 601 KiB |
BIN
docs/port/screenshots/u5.5-g06/14-welle-ende.jpg
Normal file
|
After Width: | Height: | Size: 581 KiB |
BIN
docs/port/screenshots/u5.5-g06/Characters.jpg
Normal file
|
After Width: | Height: | Size: 154 KiB |
BIN
docs/port/screenshots/u5.5-g06/Units.jpg
Normal file
|
After Width: | Height: | Size: 717 KiB |
BIN
docs/port/screenshots/u5.5-g06/figur/glasballiste-attack_a.jpg
Normal file
|
After Width: | Height: | Size: 105 KiB |
BIN
docs/port/screenshots/u5.5-g06/figur/glasballiste.jpg
Normal file
|
After Width: | Height: | Size: 106 KiB |
|
After Width: | Height: | Size: 110 KiB |
BIN
docs/port/screenshots/u5.5-g06/figur/glasballiste_meshy.jpg
Normal file
|
After Width: | Height: | Size: 111 KiB |
|
After Width: | Height: | Size: 719 KiB |
BIN
docs/port/screenshots/u5.5-g06/spiel-nachher/02-portraet.jpg
Normal file
|
After Width: | Height: | Size: 716 KiB |
BIN
docs/port/screenshots/u5.5-g06/spiel-nachher/03-kampf-nah.jpg
Normal file
|
After Width: | Height: | Size: 728 KiB |
BIN
docs/port/screenshots/u5.5-g06/spiel-nachher/04-kampf-lane.jpg
Normal file
|
After Width: | Height: | Size: 672 KiB |
|
After Width: | Height: | Size: 714 KiB |
BIN
docs/port/screenshots/u5.5-g06/spiel-vorher/02-portraet.jpg
Normal file
|
After Width: | Height: | Size: 711 KiB |
BIN
docs/port/screenshots/u5.5-g06/spiel-vorher/03-kampf-nah.jpg
Normal file
|
After Width: | Height: | Size: 724 KiB |
BIN
docs/port/screenshots/u5.5-g06/spiel-vorher/04-kampf-lane.jpg
Normal file
|
After Width: | Height: | Size: 672 KiB |
|
|
@ -1766,6 +1766,52 @@
|
|||
"death"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "glasballiste_meshy",
|
||||
"group": "Characters",
|
||||
"kind": "skinned",
|
||||
"representative": "U5.5 series: Glasballiste (g06) from a static Meshy model with the Phase-19 rig and clips fitted",
|
||||
"source": "tools/meshy/build_machine.py",
|
||||
"source_root": "unity",
|
||||
"generator": {
|
||||
"args": [
|
||||
"tools/meshy/g06/figure.json"
|
||||
],
|
||||
"inputs": [
|
||||
"tools/meshy/build_figure.py",
|
||||
"tools/meshy/g06/figure.json",
|
||||
"assets-source/meshy/g06/glasballiste-modell.glb",
|
||||
"assets-source/meshy/g06/glasballiste-rig-phase19.blend"
|
||||
]
|
||||
},
|
||||
"replaces": "g06",
|
||||
"expect": {
|
||||
"triangles": 25392,
|
||||
"bones": 20,
|
||||
"clips": [
|
||||
"idle",
|
||||
"walk",
|
||||
"attack_a",
|
||||
"attack_b",
|
||||
"hit",
|
||||
"ability",
|
||||
"death"
|
||||
]
|
||||
},
|
||||
"rules": {
|
||||
"rest_action": null,
|
||||
"root_bone": "Root",
|
||||
"required_clips": [
|
||||
"idle",
|
||||
"walk",
|
||||
"attack_a",
|
||||
"attack_b",
|
||||
"hit",
|
||||
"ability",
|
||||
"death"
|
||||
]
|
||||
}
|
||||
}
|
||||
],
|
||||
"aliases": {
|
||||
|
|
|
|||
|
|
@ -30,14 +30,14 @@ FPS = 24
|
|||
CLIP_ORDER = ['idle', 'walk', 'attack_a', 'attack_b', 'hit', 'ability', 'death']
|
||||
|
||||
|
||||
def options():
|
||||
"""Figure file and roots: from the exporter (globals) or the command line."""
|
||||
g = globals()
|
||||
def options(env=None):
|
||||
"""Figure file and roots: from the exporter (the generator's globals) or the command line."""
|
||||
g = env if env is not None else globals()
|
||||
if 'LUNE_ARGS' in g:
|
||||
temp_root = Path(g['__file__']).resolve().parents[2]
|
||||
return temp_root / g['LUNE_ARGS'][0], temp_root, Path(g['LUNE_UNITY_ROOT']), None
|
||||
argv = sys.argv[sys.argv.index('--') + 1:] if '--' in sys.argv else []
|
||||
root = Path(__file__).resolve().parents[2]
|
||||
root = Path(g['__file__']).resolve().parents[2]
|
||||
save = argv[argv.index('--save') + 1] if '--save' in argv else None
|
||||
return root / argv[0], root, root, save
|
||||
|
||||
|
|
@ -462,10 +462,16 @@ def build(figure_path, source_root, unity_root):
|
|||
return {'clips': clips, 'textures': maps, 'unit': unit, 'lod': lod, 'props': [facts for _, _, facts in props]}
|
||||
|
||||
|
||||
figure_file, source_dir, unity_dir, save_to = options()
|
||||
result = build(figure_file, source_dir, unity_dir)
|
||||
print('LUNE_FIGURE', json.dumps(result))
|
||||
# Picked up by tools/blender/lune_fbx_export.py for the export report.
|
||||
bpy.app.driver_namespace['lune_generator'] = result
|
||||
if save_to:
|
||||
bpy.ops.wm.save_as_mainfile(filepath=save_to)
|
||||
def main(build_function, env=None):
|
||||
figure_file, source_dir, unity_dir, save_to = options(env)
|
||||
result = build_function(figure_file, source_dir, unity_dir)
|
||||
print('LUNE_FIGURE', json.dumps(result))
|
||||
# Picked up by tools/blender/lune_fbx_export.py for the export report.
|
||||
bpy.app.driver_namespace['lune_generator'] = result
|
||||
if save_to:
|
||||
bpy.ops.wm.save_as_mainfile(filepath=save_to)
|
||||
|
||||
|
||||
# Run as a script or as the exporter's generator; tools/meshy/build_machine.py imports the helpers.
|
||||
if __name__ in ('__main__', '__lune_generator__'):
|
||||
main(build)
|
||||
|
|
|
|||
258
tools/meshy/build_machine.py
Normal file
|
|
@ -0,0 +1,258 @@
|
|||
"""Builds a non-humanoid figure of the Unity port from a static Meshy model and the rig and clips of
|
||||
the figure it replaces (U5.5: the Glasballiste, a walking ballista; Meshy's auto rig only takes
|
||||
humanoids). Source of truth: the untouched Meshy model, the rig file extracted from the Godot
|
||||
reference (armature and actions only) and tools/meshy/<id>/figure.json.
|
||||
|
||||
- the model: stray islands removed, scaled to the figure's width, standing on the ground,
|
||||
centred over its feet;
|
||||
- the old rig fitted to it by landmarks (leg spread, hip and weapon height, bolt tip, back of
|
||||
the stock, bow tips): every bone group is moved to the matching part of the new model, the
|
||||
location keys of the clips follow the overall scale;
|
||||
- rigid skinning: every vertex follows its nearest bone (a machine of hard parts);
|
||||
- textures, glow, faction palette and lane copy as for the Meshy figures (build_figure.py).
|
||||
|
||||
Standalone: blender --background --python tools/meshy/build_machine.py -- tools/meshy/g06/figure.json [--save out.blend]
|
||||
"""
|
||||
import importlib.util
|
||||
import json
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
import bpy
|
||||
import numpy as np
|
||||
from mathutils import Matrix, Vector
|
||||
|
||||
_spec = importlib.util.spec_from_file_location('lune_build_figure', str(Path(__file__).resolve().parent / 'build_figure.py'))
|
||||
bf = importlib.util.module_from_spec(_spec)
|
||||
_spec.loader.exec_module(bf)
|
||||
|
||||
|
||||
def keep_main_islands(mesh, share):
|
||||
"""Removes parts that hang free in the air (Meshy left a loose crystal tip): connected
|
||||
components (seam copies joined by position) below a share of all vertices."""
|
||||
import bmesh
|
||||
data = mesh.data
|
||||
count = len(data.vertices)
|
||||
parent = list(range(count))
|
||||
|
||||
def find(i):
|
||||
while parent[i] != i:
|
||||
parent[i] = parent[parent[i]]
|
||||
i = parent[i]
|
||||
return i
|
||||
|
||||
def union(a, b):
|
||||
ra, rb = find(a), find(b)
|
||||
if ra != rb:
|
||||
parent[ra] = rb
|
||||
|
||||
for poly in data.polygons:
|
||||
verts = list(poly.vertices)
|
||||
for v in verts[1:]:
|
||||
union(verts[0], v)
|
||||
seen = {}
|
||||
for v in data.vertices:
|
||||
key = tuple(round(c, 5) for c in v.co)
|
||||
if key in seen:
|
||||
union(seen[key], v.index)
|
||||
else:
|
||||
seen[key] = v.index
|
||||
sizes = {}
|
||||
for i in range(count):
|
||||
root = find(i)
|
||||
sizes[root] = sizes.get(root, 0) + 1
|
||||
drop = {i for i in range(count) if sizes[find(i)] < share * count}
|
||||
bm = bmesh.new()
|
||||
bm.from_mesh(data)
|
||||
bm.verts.ensure_lookup_table()
|
||||
bmesh.ops.delete(bm, geom=[bm.verts[i] for i in sorted(drop)], context='VERTS')
|
||||
bm.to_mesh(data)
|
||||
bm.free()
|
||||
return len(drop)
|
||||
|
||||
|
||||
def place(mesh, width):
|
||||
"""Uniform scale to the figure's width; feet on the ground, centred over them."""
|
||||
data = mesh.data
|
||||
co = np.array([v.co[:] for v in data.vertices])
|
||||
scale = width / (co[:, 0].max() - co[:, 0].min())
|
||||
co *= scale
|
||||
low = co[:, 2].min()
|
||||
feet = co[co[:, 2] < low + 0.08 * (co[:, 2].max() - low)]
|
||||
offset = np.array([feet[:, 0].mean(), feet[:, 1].mean(), low])
|
||||
co -= offset
|
||||
data.vertices.foreach_set('co', co.ravel())
|
||||
data.update()
|
||||
return co, scale
|
||||
|
||||
|
||||
def landmarks(co):
|
||||
height = co[:, 2].max()
|
||||
low = co[co[:, 2] < 0.35 * height]
|
||||
reach = np.abs(co[:, 0]).max()
|
||||
bow = co[np.abs(co[:, 0]) > 0.85 * reach]
|
||||
weapon_z = float(bow[:, 2].mean())
|
||||
top = co[co[:, 2] > weapon_z - 0.12 * height]
|
||||
return {'height': float(height), 'leg_x': float(np.abs(low[:, 0]).mean()), 'weapon_z': weapon_z,
|
||||
'tip_y': float(co[:, 1].min()), 'back_y': float(top[:, 1].max()), 'bow_x': float(reach), 'bow_y': float(bow[:, 1].mean())}
|
||||
|
||||
|
||||
def fit_rig(arm, old, new):
|
||||
"""Moves every bone group of the old rig onto the matching part of the new model."""
|
||||
s = new['weapon_z'] / old['weapon_z']
|
||||
hip_old, hip_new = old['hip_z'], new['weapon_z'] * old['hip_z'] / old['weapon_z']
|
||||
front = new['tip_y'] / old['tip_y']
|
||||
back = new['back_y'] / old['back_y']
|
||||
|
||||
def weapon(p):
|
||||
y = p.y * (front if p.y < 0 else back)
|
||||
return Vector((p.x * s, y, p.z - old['weapon_z'] + new['weapon_z']))
|
||||
|
||||
def legs(p):
|
||||
return Vector((p.x * new['leg_x'] / old['leg_x'], p.y * s, p.z * hip_new / hip_old))
|
||||
|
||||
def spine(p):
|
||||
t = (p.z - hip_old) / (old['weapon_z'] - hip_old)
|
||||
return Vector((p.x * s, p.y * s, hip_new + t * (new['weapon_z'] - hip_new)))
|
||||
|
||||
def limb(p, tip):
|
||||
q = weapon(p)
|
||||
if tip:
|
||||
q.x = np.sign(p.x) * new['bow_x']
|
||||
q.y = new['bow_y']
|
||||
else:
|
||||
q.x = p.x * new['bow_x'] / old['bow_x']
|
||||
return q
|
||||
|
||||
bpy.context.view_layer.objects.active = arm
|
||||
bpy.ops.object.mode_set(mode='EDIT')
|
||||
for bone in arm.data.edit_bones:
|
||||
name = bone.name
|
||||
head, tail = bone.head.copy(), bone.tail.copy()
|
||||
if name.startswith(('Thigh', 'Shin', 'Tarsus', 'Foot', 'Pelvis')):
|
||||
bone.head, bone.tail = legs(head), legs(tail)
|
||||
elif name == 'Spine':
|
||||
bone.head, bone.tail = spine(head), spine(tail)
|
||||
elif name.startswith('LimbTip'):
|
||||
bone.head, bone.tail = limb(head, False), limb(tail, True)
|
||||
elif name.startswith('Limb'):
|
||||
bone.head, bone.tail = limb(head, False), limb(tail, False)
|
||||
elif name != 'Root':
|
||||
bone.head, bone.tail = weapon(head), weapon(tail)
|
||||
bpy.ops.object.mode_set(mode='OBJECT')
|
||||
return s
|
||||
|
||||
|
||||
def fcurves(action):
|
||||
if hasattr(action, 'layers') and len(action.layers):
|
||||
for layer in action.layers:
|
||||
for strip in layer.strips:
|
||||
for bag in strip.channelbags:
|
||||
yield from bag.fcurves
|
||||
elif hasattr(action, 'fcurves'):
|
||||
yield from action.fcurves
|
||||
|
||||
|
||||
def scale_locations(action, s):
|
||||
for curve in fcurves(action):
|
||||
if curve.data_path.endswith('location'):
|
||||
for key in curve.keyframe_points:
|
||||
key.co.y *= s
|
||||
key.handle_left.y *= s
|
||||
key.handle_right.y *= s
|
||||
|
||||
|
||||
def rigid_skin(mesh, arm, regions):
|
||||
"""Every vertex follows its nearest deforming bone (distance to the bone segment). A bone with
|
||||
a region (figure.json "bone_regions", e.g. the bolt only in front of the bow) takes only
|
||||
vertices inside it, so a long rail bone does not carry the whole stock."""
|
||||
bones = [b for b in arm.data.bones if b.use_deform and b.name != 'Root']
|
||||
co = np.array([v.co[:] for v in mesh.data.vertices])
|
||||
best = np.full(len(co), np.inf)
|
||||
owner = np.zeros(len(co), dtype=int)
|
||||
for index, bone in enumerate(bones):
|
||||
a = np.array((arm.matrix_world @ bone.head_local)[:])
|
||||
b = np.array((arm.matrix_world @ bone.tail_local)[:])
|
||||
ab = b - a
|
||||
t = np.clip(((co - a) @ ab) / max(ab @ ab, 1e-9), 0.0, 1.0)
|
||||
d = np.linalg.norm(co - (a + t[:, None] * ab), axis=1)
|
||||
region = regions.get(bone.name, {})
|
||||
for axis, name in enumerate('xyz'):
|
||||
if name + '_max' in region:
|
||||
d[co[:, axis] > region[name + '_max']] = np.inf
|
||||
if name + '_min' in region:
|
||||
d[co[:, axis] < region[name + '_min']] = np.inf
|
||||
closer = d < best
|
||||
best[closer] = d[closer]
|
||||
owner[closer] = index
|
||||
counts = {}
|
||||
for index, bone in enumerate(bones):
|
||||
members = np.nonzero(owner == index)[0].tolist()
|
||||
group = mesh.vertex_groups.new(name=bone.name)
|
||||
if members:
|
||||
group.add(members, 1.0, 'REPLACE')
|
||||
counts[bone.name] = len(members)
|
||||
modifier = mesh.modifiers.new('Armature', 'ARMATURE')
|
||||
modifier.object = arm
|
||||
mesh.parent = arm
|
||||
mesh.matrix_parent_inverse = Matrix.Identity(4)
|
||||
return counts
|
||||
|
||||
|
||||
def build(figure_path, source_root, unity_root):
|
||||
figure = json.loads(figure_path.read_text())
|
||||
bpy.ops.wm.read_factory_settings(use_empty=True)
|
||||
scene = bpy.context.scene
|
||||
scene.render.fps = bf.FPS
|
||||
scene.render.fps_base = 1.0
|
||||
scene.unit_settings.system = 'METRIC'
|
||||
scene.unit_settings.scale_length = 1.0
|
||||
|
||||
objects = bf.import_glb(source_root / figure['model'])
|
||||
mesh = next(o for o in objects if o.type == 'MESH')
|
||||
for obj in objects:
|
||||
if obj is not mesh:
|
||||
bpy.data.objects.remove(obj, do_unlink=True)
|
||||
bpy.ops.object.select_all(action='DESELECT')
|
||||
mesh.select_set(True)
|
||||
bpy.context.view_layer.objects.active = mesh
|
||||
bpy.ops.object.transform_apply(location=True, rotation=True, scale=True)
|
||||
dropped = keep_main_islands(mesh, figure.get('min_island_share', 0.01))
|
||||
co, model_scale = place(mesh, figure['width'])
|
||||
new = landmarks(co)
|
||||
|
||||
with bpy.data.libraries.load(str(source_root / figure['rig_blend'])) as (src, dst):
|
||||
dst.objects = [figure['armature']]
|
||||
dst.actions = list(src.actions)
|
||||
arm = dst.objects[0]
|
||||
scene.collection.objects.link(arm)
|
||||
if arm.animation_data:
|
||||
arm.animation_data.action = None
|
||||
for action in list(bpy.data.actions):
|
||||
if action.name not in figure['clips']:
|
||||
bpy.data.actions.remove(action)
|
||||
s = fit_rig(arm, figure['rig_landmarks'], new)
|
||||
for action in bpy.data.actions:
|
||||
scale_locations(action, s)
|
||||
action.use_fake_user = True
|
||||
mesh.name = mesh.data.name = figure['id'].capitalize() + 'Body'
|
||||
weights = rigid_skin(mesh, arm, figure.get('bone_regions', {}))
|
||||
|
||||
material = mesh.material_slots[0].material
|
||||
maps = bf.textures(material, str(unity_root / figure['textures']), figure['glow'], figure.get('palette', {}))
|
||||
material.name = figure['material']
|
||||
for node in list(material.node_tree.nodes):
|
||||
if node.type not in ('BSDF_PRINCIPLED', 'OUTPUT_MATERIAL'):
|
||||
material.node_tree.nodes.remove(node)
|
||||
for image in list(bpy.data.images):
|
||||
bpy.data.images.remove(image)
|
||||
lod = bf.lane_lod(mesh, figure['lod']) if 'lod' in figure else None
|
||||
scene.frame_set(0)
|
||||
clips = {a.name: {'seconds': round((a.frame_range[1] - a.frame_range[0]) / bf.FPS, 4), 'loop': bool(a.get('loop', False)),
|
||||
'contact_seconds': float(a.get('contact_seconds', -1.0))} for a in bpy.data.actions}
|
||||
return {'model_scale': round(model_scale, 4), 'dropped_vertices': dropped, 'landmarks': {k: round(v, 4) for k, v in new.items()},
|
||||
'rig_scale': round(s, 4), 'weights': weights, 'clips': clips, 'textures': maps, 'lod': lod}
|
||||
|
||||
|
||||
if __name__ in ('__main__', '__lune_generator__'):
|
||||
bf.main(build, globals())
|
||||
6
tools/meshy/g06/01-konzept-ansichten.json
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
"ai_model": "gpt-image-2",
|
||||
"input_task_id": "01a1258c-128a-720d-ab9f-3c4d0294295b",
|
||||
"generate_multi_view": true,
|
||||
"prompt": "The same walking ballista machine from several angles (front, side, three-quarter back), identical design, materials and colours, whole machine visible in each view, plain light grey background, no text."
|
||||
}
|
||||
10
tools/meshy/g06/01-konzept.json
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
{
|
||||
"ai_model": "gpt-image-2",
|
||||
"prompt": "Concept of the war machine in the first two references for a 3D fantasy strategy game, painted in exactly the same art style and materials as the third reference (a fellow unit of its faction), keeping the layout and proportions of the second reference. The Glasballiste, a walking ballista: two strong digitigrade mechanical legs of black basalt plates with worn gold joint rings and gold-tipped claw feet, carrying on its hips a huge crossbow as its whole body: a long black and gold stock with a glowing molten orange crystal rail, a gold gear wheel on the side, two wide curved bow limbs of glowing orange faceted crystal capped with gold, a taut dark bowstring, and a glowing orange crystal bolt loaded on the rail. No arms, no head, no rider. Stylized realism, hand-sculpted detailed forms. Seen exactly from the front with the bolt pointing straight at the viewer, legs apart, whole machine visible, centered. Plain light grey background, soft even studio light, no ground shadow, no text.",
|
||||
"aspect_ratio": "1:1",
|
||||
"reference_image_urls": [
|
||||
"@../saumwacht-godot/assets-source/phase3/masters/glutpakt/unit_g06_glasballiste_icon.png",
|
||||
"@tools/meshy/g06/ref-g06-glasballiste.png",
|
||||
"@assets-source/meshy/g01/kohlenbeisser-konzept.png"
|
||||
]
|
||||
}
|
||||
18
tools/meshy/g06/02-modell.json
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
{
|
||||
"ai_model": "latest",
|
||||
"should_texture": true,
|
||||
"enable_pbr": true,
|
||||
"texture_resolution": "2k",
|
||||
"should_remesh": true,
|
||||
"topology": "triangle",
|
||||
"target_polycount": 20000,
|
||||
"save_pre_remeshed_model": true,
|
||||
"target_formats": [
|
||||
"glb"
|
||||
],
|
||||
"multi_view_thumbnails": true,
|
||||
"image_urls": [
|
||||
"@assets-source/meshy/g06/glasballiste-konzept-vorn.png",
|
||||
"@assets-source/meshy/g06/glasballiste-konzept-hinten.png"
|
||||
]
|
||||
}
|
||||
17
tools/meshy/g06/figure.json
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
{
|
||||
"id": "glasballiste_meshy",
|
||||
"replaces": "g06",
|
||||
"model": "assets-source/meshy/g06/glasballiste-modell.glb",
|
||||
"rig_blend": "assets-source/meshy/g06/glasballiste-rig-phase19.blend",
|
||||
"armature": "GlassRig",
|
||||
"rig_landmarks": {"weapon_z": 1.17, "hip_z": 0.8, "leg_x": 0.26, "tip_y": -1.0, "back_y": 0.36, "bow_x": 0.89, "bow_y": 0.03},
|
||||
"width": 1.85,
|
||||
"bone_regions": {"Bolt": {"y_max": -0.75}, "Quarrel": {"y_max": -0.75}, "Draw": {"y_max": -99}},
|
||||
"min_island_share": 0.01,
|
||||
"material": "AI_Glasballiste",
|
||||
"textures": "Assets/Luneraria/Art/Textures/ai-glasballiste",
|
||||
"glow": {"hue": [0, 42], "saturation": 0.6, "value": 0.5, "metal_below": 0.5},
|
||||
"lod": {"triangles": 5000, "sharp_degrees": 50, "lod0_screen": 0.2},
|
||||
"palette": {"rock": {"color": "41434b", "strength": 0.8}, "metal": {"color": "c99645", "strength": 1.0}},
|
||||
"clips": ["idle", "walk", "attack_a", "attack_b", "hit", "ability", "death"]
|
||||
}
|
||||
BIN
tools/meshy/g06/ref-g06-glasballiste.png
Normal file
|
After Width: | Height: | Size: 990 KiB |
18
tools/meshy/g06/tasks/konzept-ansichten.json
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
{
|
||||
"id": "01a1258d-1599-72cf-8902-29d707f5b6df",
|
||||
"type": "image-to-image",
|
||||
"ai_model": "gpt-image-2",
|
||||
"prompt": "The same walking ballista machine from several angles (front, side, three-quarter back), identical design, materials and colours, whole machine visible in each view, plain light grey background, no text.",
|
||||
"status": "SUCCEEDED",
|
||||
"progress": 100,
|
||||
"created_at": 1791631366176,
|
||||
"started_at": 1791631366193,
|
||||
"finished_at": 1791631398307,
|
||||
"expires_at": 1791890598307,
|
||||
"image_urls": [
|
||||
"https://assets.meshy.ai/c8cdc243-64e1-4e9d-9fa1-3bd5ed731d84/uploads/multi_view_image_01a1258d-92e9-71a0-8a43-ec229edf4945_part_0.png",
|
||||
"https://assets.meshy.ai/c8cdc243-64e1-4e9d-9fa1-3bd5ed731d84/uploads/multi_view_image_01a1258d-92e9-71a0-8a43-ec229edf4945_part_1.png",
|
||||
"https://assets.meshy.ai/c8cdc243-64e1-4e9d-9fa1-3bd5ed731d84/uploads/multi_view_image_01a1258d-92e9-71a0-8a43-ec229edf4945_part_2.png"
|
||||
],
|
||||
"consumed_credits": 12
|
||||
}
|
||||
16
tools/meshy/g06/tasks/konzept.json
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
{
|
||||
"id": "01a1258c-128a-720d-ab9f-3c4d0294295b",
|
||||
"type": "image-to-image",
|
||||
"ai_model": "gpt-image-2",
|
||||
"prompt": "Concept of the war machine in the first two references for a 3D fantasy strategy game, painted in exactly the same art style and materials as the third reference (a fellow unit of its faction), keeping the layout and proportions of the second reference. The Glasballiste, a walking ballista: two strong digitigrade mechanical legs of black basalt plates with worn gold joint rings and gold-tipped claw feet, carrying on its hips a huge crossbow as its whole body: a long black and gold stock with a glowing molten orange crystal rail, a gold gear wheel on the side, two wide curved bow limbs of glowing orange faceted crystal capped with gold, a taut dark bowstring, and a glowing orange crystal bolt loaded on the rail. No arms, no head, no rider. Stylized realism, hand-sculpted detailed forms. Seen exactly from the front with the bolt pointing straight at the viewer, legs apart, whole machine visible, centered. Plain light grey background, soft even studio light, no ground shadow, no text.",
|
||||
"status": "SUCCEEDED",
|
||||
"progress": 100,
|
||||
"created_at": 1791631301295,
|
||||
"started_at": 1791631301310,
|
||||
"finished_at": 1791631337557,
|
||||
"expires_at": 1791890537557,
|
||||
"image_urls": [
|
||||
"https://assets.meshy.ai/c8cdc243-64e1-4e9d-9fa1-3bd5ed731d84/uploads/image_01a1258c-128a-720d-ab9f-3c4d0294295b_0.png"
|
||||
],
|
||||
"consumed_credits": 12
|
||||
}
|
||||
41
tools/meshy/g06/tasks/modell.json
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
{
|
||||
"id": "01a1258e-10fb-73af-95f7-63d588564c67",
|
||||
"type": "multi-image-to-3d",
|
||||
"name": "",
|
||||
"art_style": "",
|
||||
"object_prompt": "",
|
||||
"style_prompt": "",
|
||||
"negative_prompt": "",
|
||||
"texture_prompt": "",
|
||||
"texture_image_url": "",
|
||||
"text_style_prompt": "",
|
||||
"image_style_url": "",
|
||||
"status": "SUCCEEDED",
|
||||
"created_at": 1791631430850,
|
||||
"progress": 100,
|
||||
"started_at": 1791631430860,
|
||||
"finished_at": 1791631547588,
|
||||
"expires_at": 1791890747588,
|
||||
"task_error": null,
|
||||
"model_url": "https://assets.meshy.ai/c8cdc243-64e1-4e9d-9fa1-3bd5ed731d84/tasks/01a1258e-10fb-73af-95f7-63d588564c67/output/model.glb",
|
||||
"model_urls": {
|
||||
"glb": "https://assets.meshy.ai/c8cdc243-64e1-4e9d-9fa1-3bd5ed731d84/tasks/01a1258e-10fb-73af-95f7-63d588564c67/output/model.glb",
|
||||
"pre_remeshed_glb": "https://assets.meshy.ai/c8cdc243-64e1-4e9d-9fa1-3bd5ed731d84/tasks/01a1258e-10fb-73af-95f7-63d588564c67/output/pre_remeshed_model.glb"
|
||||
},
|
||||
"thumbnail_url": "https://assets.meshy.ai/c8cdc243-64e1-4e9d-9fa1-3bd5ed731d84/tasks/01a1258e-10fb-73af-95f7-63d588564c67/output/preview.png",
|
||||
"thumbnail_urls": {
|
||||
"back": "https://assets.meshy.ai/c8cdc243-64e1-4e9d-9fa1-3bd5ed731d84/tasks/01a1258e-10fb-73af-95f7-63d588564c67/output/preview_back.png",
|
||||
"front": "https://assets.meshy.ai/c8cdc243-64e1-4e9d-9fa1-3bd5ed731d84/tasks/01a1258e-10fb-73af-95f7-63d588564c67/output/preview_front.png",
|
||||
"left": "https://assets.meshy.ai/c8cdc243-64e1-4e9d-9fa1-3bd5ed731d84/tasks/01a1258e-10fb-73af-95f7-63d588564c67/output/preview_left.png",
|
||||
"right": "https://assets.meshy.ai/c8cdc243-64e1-4e9d-9fa1-3bd5ed731d84/tasks/01a1258e-10fb-73af-95f7-63d588564c67/output/preview_right.png"
|
||||
},
|
||||
"texture_urls": [
|
||||
{
|
||||
"base_color": "https://assets.meshy.ai/c8cdc243-64e1-4e9d-9fa1-3bd5ed731d84/tasks/01a1258e-10fb-73af-95f7-63d588564c67/output/texture_0.png",
|
||||
"metallic": "https://assets.meshy.ai/c8cdc243-64e1-4e9d-9fa1-3bd5ed731d84/tasks/01a1258e-10fb-73af-95f7-63d588564c67/output/texture_0_metallic.png",
|
||||
"roughness": "https://assets.meshy.ai/c8cdc243-64e1-4e9d-9fa1-3bd5ed731d84/tasks/01a1258e-10fb-73af-95f7-63d588564c67/output/texture_0_roughness.png",
|
||||
"normal": "https://assets.meshy.ai/c8cdc243-64e1-4e9d-9fa1-3bd5ed731d84/tasks/01a1258e-10fb-73af-95f7-63d588564c67/output/texture_0_normal.png"
|
||||
}
|
||||
],
|
||||
"consumed_credits": 30
|
||||
}
|
||||