Animations-Import, Massenimport-Queue, Asset-Archivierung, Voxel-Refactor

- Animations-Import: GLB wird direkt vom Ursprungspfad geladen (kein Zwischenkopieren), J3O in clips/ gespeichert
- RetargetingSystem: Translations-Tracks im Full-Retarget-Pfad erhalten (Hips-Y für sit_down)
- AnimationLibrary: lädt nur J3O, Clip-Name wird bei applyTo() auf Library-Key umbenannt
- SharedInput: animPreviewAddAnimPath → ConcurrentLinkedQueue animImportQueue (Massenimport-Fix)
- EditorApp: archiveOriginal() archiviert Originaldateien nach assets/imported/<assettyp>/
- EditorApp: Animations-Unterknoten im Asset-Baum zeigen enthaltene Clip-Namen
- Neue Animations-Clips: sit_down, get_up_sitting, sitting, pickup, sprinting u.a.
- Voxel: VoxelChunkState entfernt, VoxelChunkNode/MarchingCubes überarbeitet
- Map: Voxel-Chunks bereinigt, Terrain-Chunks aktualisiert

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-06-20 20:52:04 +02:00
parent a369647e9c
commit c8f1dd9432
239 changed files with 8234 additions and 658 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

View File

@@ -3,13 +3,10 @@ MaterialDef Voxel {
MaterialParameters {
Texture2D TexFlat
Texture2D TexSteep
Texture2D TexCeil
Texture2D NormalMapFlat
Texture2D NormalMapSteep
Texture2D NormalMapCeil
Texture2D DisplacementMapFlat
Texture2D DisplacementMapSteep
Texture2D DisplacementMapCeil
Float TexScale : 8.0
Float DisplacementScale : 0.3
Float TessellationLevel : 4.0
@@ -32,7 +29,6 @@ MaterialDef Voxel {
Defines {
HAS_NM_FLAT : NormalMapFlat
HAS_NM_STEEP : NormalMapSteep
HAS_NM_CEIL : NormalMapCeil
HAS_LIGHTDIR : LightDir
HAS_SCENE_LIGHT : SunColor
DEBUG_NO_LIGHT : DebugNoLight
@@ -60,10 +56,8 @@ MaterialDef Voxel {
Defines {
HAS_NM_FLAT : NormalMapFlat
HAS_NM_STEEP : NormalMapSteep
HAS_NM_CEIL : NormalMapCeil
HAS_DISP_FLAT : DisplacementMapFlat
HAS_DISP_STEEP : DisplacementMapSteep
HAS_DISP_CEIL : DisplacementMapCeil
HAS_LIGHTDIR : LightDir
HAS_SCENE_LIGHT : SunColor
}

View File

@@ -0,0 +1,23 @@
#Thu Jun 18 17:47:21 CEST 2026
attachedEmitters.count=0
attachedLight.0=0.00000|0.10000|0.00000|0.80000|1.00000|0.80000|12.00000|50.00000
attachedLights.count=1
castShadow=true
category=
cullDistance=120.0
lod1Distance=30.0
lod1Path=
lod2Distance=80.0
lod2Path=
name=Höhlenkristall1
pivotOffsetY=0.0
placementOffsetY=0.0
randomScaleMax=1.0
randomScaleMin=1.0
receiveShadow=true
scaleX=1.0
scaleY=1.0
scaleZ=1.0
solid=true
tags=
uniformScale=true

View File

@@ -0,0 +1,27 @@
#Sat Jun 20 13:06:13 CEST 2026
attachedEmitters.count=0
attachedLights.count=0
castShadow=true
category=
cullDistance=120.0
interactableOffsetX=0.0
interactableOffsetY=0.6
interactableOffsetZ=0.0
interactableRotY=1.5707964
interactableType=BENCH
lod1Distance=30.0
lod1Path=
lod2Distance=80.0
lod2Path=
name=bank
pivotOffsetY=0.0
placementOffsetY=0.0
randomScaleMax=1.0
randomScaleMin=1.0
receiveShadow=true
scaleX=1.0
scaleY=1.0
scaleZ=1.0
solid=true
tags=
uniformScale=true

View File

@@ -0,0 +1,27 @@
#Sat Jun 20 14:30:44 CEST 2026
attachedEmitters.count=0
attachedLights.count=0
castShadow=true
category=
cullDistance=120.0
interactableOffsetX=0.0
interactableOffsetY=0.5
interactableOffsetZ=0.0
interactableRotY=1.5707964
interactableType=BENCH
lod1Distance=30.0
lod1Path=
lod2Distance=80.0
lod2Path=
name=bank1
pivotOffsetY=0.0
placementOffsetY=0.0
randomScaleMax=1.0
randomScaleMin=1.0
receiveShadow=true
scaleX=1.0
scaleY=1.0
scaleZ=1.0
solid=false
tags=
uniformScale=true

View File

@@ -1,6 +1,5 @@
uniform sampler2D m_TexFlat;
uniform sampler2D m_TexSteep;
uniform sampler2D m_TexCeil;
uniform float m_TexScale;
#ifdef HAS_NM_FLAT
@@ -9,9 +8,6 @@ uniform sampler2D m_NormalMapFlat;
#ifdef HAS_NM_STEEP
uniform sampler2D m_NormalMapSteep;
#endif
#ifdef HAS_NM_CEIL
uniform sampler2D m_NormalMapCeil;
#endif
in vec3 vWorldPos;
in vec3 vNormal;
@@ -55,27 +51,24 @@ void main() {
vec2 uvY = vWorldPos.xz / m_TexScale;
vec2 uvZ = vWorldPos.xy / m_TexScale;
// Flach ab ~11° Gefälle (20% grade, normal.y≈0.98); Fels darunter.
// Flach ab ~11° Gefälle (20% grade, normal.y≈0.98); alles andere Fels.
float flatBlend = smoothstep(0.94, 0.99, vNormal.y);
float ceilBlend = 1.0 - smoothstep(-0.6, -0.3, vNormal.y);
float steepBlend = max(0.0, 1.0 - flatBlend - ceilBlend);
float steepBlend = 1.0 - flatBlend;
// Flat: reines XZ-UV wie das Terrain (uvY = worldPos.xz / texScale), kein Triplanar.
// Steep/Ceil: Triplanar bleibt, da es dort keine eindeutige Projektion gibt.
// Steep: Triplanar für alle nicht-flachen Flächen inkl. Decken und Tunnelwände.
vec4 col = texture(m_TexFlat, uvY) * flatBlend
+ triplanar(m_TexSteep, uvX, uvY, uvZ, bw) * steepBlend
+ triplanar(m_TexCeil, uvX, uvY, uvZ, bw) * ceilBlend;
+ triplanar(m_TexSteep, uvX, uvY, uvZ, bw) * steepBlend;
// Geometrie-Normale für Beleuchtung, ggf. durch Normal-Map ersetzt.
vec3 N = normalize(vNormal);
#if defined(HAS_NM_FLAT) || defined(HAS_NM_STEEP) || defined(HAS_NM_CEIL)
#if defined(HAS_NM_FLAT) || defined(HAS_NM_STEEP)
vec3 pertN = vec3(0.0);
float totalBlend = 0.0;
#ifdef HAS_NM_FLAT
if (flatBlend > 0.001) {
vec3 nmFlat = texture(m_NormalMapFlat, uvY).rgb * 2.0 - 1.0;
// Y-Projektion RNM (identisch mit triplanarNormal Y-Achse bei bw.y=1)
nmFlat = vec3(nmFlat.xy + N.xz, abs(nmFlat.z) * N.y);
pertN += normalize(nmFlat.xzy) * flatBlend;
totalBlend += flatBlend;
@@ -86,12 +79,6 @@ void main() {
pertN += triplanarNormal(m_NormalMapSteep, uvX, uvY, uvZ, bw, N) * steepBlend;
totalBlend += steepBlend;
}
#endif
#ifdef HAS_NM_CEIL
if (ceilBlend > 0.001) {
pertN += triplanarNormal(m_NormalMapCeil, uvX, uvY, uvZ, bw, N) * ceilBlend;
totalBlend += ceilBlend;
}
#endif
if (totalBlend > 0.001) {
N = normalize(pertN / totalBlend);

View File

@@ -1,23 +1,33 @@
{
"clips": [
"get_up_sitting",
"idle",
"idle_jump",
"pickup",
"running",
"running_jump",
"sprint",
"sit_down",
"sitting",
"sitting_floor",
"sprinting",
"stand_up",
"tpose",
"walking",
"pickup"
"walking"
],
"actionMap": {
"DEFAULT": "tpose",
"IDLE": "idle",
"WALK": "walking",
"RUN": "running",
"SPRINT": "sprint",
"JUMP": "idle_jump",
"SPRINT": "sprinting",
"RUNNING_JUMP": "running_jump",
"PICK_UP": "pickup"
}
"JUMP": "idle_jump",
"PICK_UP": "pickup",
"SIT_DOWN": "sit_down",
"SIT_UP": "stand_up",
"SITTING": "sitting"
},
"previewModelPath": "Models/Chars/mainchar.j3o",
"sinkMap": {},
"anchorBoneMap": {}
}

View File

@@ -1,21 +0,0 @@
{
"clips": [
"idle",
"idle_jump",
"running",
"running_jump",
"sprint",
"stand_up",
"tpose",
"walking"
],
"actionMap": {
"DEFAULT": "tpose",
"IDLE": "idle",
"JUMP": "idle_jump",
"WALK": "walking",
"RUN": "running",
"SPRINT": "sprint",
"RUNNING_JUMP": "running_jump"
}
}