Skip to content

Commit

Permalink
more world lights
Browse files Browse the repository at this point in the history
  • Loading branch information
4sval committed Jan 13, 2023
1 parent 59e4c7c commit 481d9d3
Show file tree
Hide file tree
Showing 11 changed files with 106 additions and 49 deletions.
13 changes: 7 additions & 6 deletions FModel/Resources/default.vert
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
#version 460 core
#version 460 core

layout (location = 1) in vec3 vPos;
layout (location = 2) in vec3 vNormal;
Expand All @@ -12,8 +12,8 @@ layout (location = 9) in mat4 vInstanceMatrix;
layout (location = 13) in vec3 vMorphTargetPos;
layout (location = 14) in vec3 vMorphTargetTangent;

//const int MAX_BONES = 0;
//const int MAX_BONE_INFLUENCE = 0;
//const int MAX_BONES = 140;
//const int MAX_BONE_INFLUENCE = 4;

uniform mat4 uView;
uniform mat4 uProjection;
Expand All @@ -33,13 +33,14 @@ void main()
vec3 tangent = mix(vTangent, vMorphTargetTangent, uMorphTime);
// for(int i = 0 ; i < MAX_BONE_INFLUENCE; i++)
// {
// if(vBoneIds[i] == -1) continue;
// if(vBoneIds[i] >= MAX_BONES)
// int boneIndex = int(vBoneIds[i]);
// if(boneIndex == -1) continue;
// if(boneIndex >= MAX_BONES)
// {
// break;
// }
//
// vec4 localPos = uFinalBonesMatrix[int(vBoneIds[i])] * pos;
// vec4 localPos = uFinalBonesMatrix[boneIndex] * pos;
// pos += localPos * vBoneWeights[i];
// }

Expand Down
16 changes: 16 additions & 0 deletions FModel/Views/Snooper/Lights/Light.cs
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,22 @@ public abstract class Light : IDisposable
public float Intensity;
public bool IsSetup;

public Light(Texture icon, UObject light)
{
Transform = new Transform
{
Position = light.GetOrDefault("RelativeLocation", FVector.ZeroVector) * Constants.SCALE_DOWN_RATIO,
Rotation = light.GetOrDefault("RelativeRotation", FRotator.ZeroRotator).Quaternion(),
Scale = light.GetOrDefault("RelativeScale3D", FVector.OneVector)
};

Model = Guid.NewGuid();
Icon = icon;

Color = light.GetOrDefault("LightColor", new FColor(0xFF, 0xFF, 0xFF, 0xFF));
Intensity = light.GetOrDefault("Intensity", 1.0f);
}

public Light(FGuid model, Texture icon, UObject parent, UObject light, Transform transform)
{
Transform = new Transform
Expand Down
12 changes: 11 additions & 1 deletion FModel/Views/Snooper/Lights/PointLight.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,19 @@ public class PointLight : Light
public float Linear;
public float Quadratic;

public PointLight(Texture icon, UObject point) : base(icon, point)
{
if (!point.TryGetValue(out float radius, "SourceRadius", "AttenuationRadius"))
radius = 1.0f;

radius *= Constants.SCALE_DOWN_RATIO;
Linear = 4.5f / radius;
Quadratic = 75.0f / MathF.Pow(radius, 2.0f);
}

public PointLight(FGuid model, Texture icon, UObject parent, UObject point, Transform transform) : base(model, icon, parent, point, transform)
{
if (!point.TryGetValue(out float radius, "AttenuationRadius", "SourceRadius"))
if (!point.TryGetValue(out float radius, "SourceRadius", "AttenuationRadius"))
radius = 1.0f;

radius *= Constants.SCALE_DOWN_RATIO;
Expand Down
12 changes: 11 additions & 1 deletion FModel/Views/Snooper/Lights/SpotLight.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,19 @@ public class SpotLight : Light
public float InnerConeAngle;
public float OuterConeAngle;

public SpotLight(Texture icon, UObject spot) : base(icon, spot)
{
if (!spot.TryGetValue(out Attenuation, "SourceRadius", "AttenuationRadius"))
Attenuation = 1.0f;

Attenuation *= Constants.SCALE_DOWN_RATIO;
InnerConeAngle = spot.GetOrDefault("InnerConeAngle", 50.0f);
OuterConeAngle = spot.GetOrDefault("OuterConeAngle", 60.0f);
}

public SpotLight(FGuid model, Texture icon, UObject parent, UObject spot, Transform transform) : base(model, icon, parent, spot, transform)
{
if (!spot.TryGetValue(out Attenuation, "AttenuationRadius", "SourceRadius"))
if (!spot.TryGetValue(out Attenuation, "SourceRadius", "AttenuationRadius"))
Attenuation = 1.0f;

Attenuation *= Constants.SCALE_DOWN_RATIO;
Expand Down
45 changes: 21 additions & 24 deletions FModel/Views/Snooper/Models/Animations/Animation.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,57 +2,54 @@
using System.Collections.Generic;
using System.Numerics;
using CUE4Parse_Conversion.Animations;
using CUE4Parse.UE4.Assets.Exports.Animation;
using CUE4Parse.UE4.Objects.Core.Math;

namespace FModel.Views.Snooper.Models.Animations;

public class Animation : IDisposable
{
public float CurrentTime;
public int CurrentTime;
public float DeltaTime;
public CAnimSet CurrentAnimation;
public Transform[] FinalBonesMatrix;

public Animation(CAnimSet anim, Dictionary<string, int> nameToIndex, Dictionary<int, Transform> indexToTransform)
public Animation(CAnimSet anim)
{
CurrentTime = 0f;
CurrentTime = 0;
CurrentAnimation = anim;

FinalBonesMatrix = new Transform[anim.TrackBoneNames.Length];
for (int i = 0; i < FinalBonesMatrix.Length; i++)
{
if (!nameToIndex.TryGetValue(anim.TrackBoneNames[i].Text, out var boneIndex) ||
!indexToTransform.TryGetValue(boneIndex, out var boneTransform))
{
boneTransform = Transform.Identity;
}

FinalBonesMatrix[i] = Transform.Identity;
FinalBonesMatrix[i].Relation = boneTransform.Matrix;
}
}

public void UpdateAnimation(float deltaTime)
public void UpdateAnimation(FMeshBoneInfo[] boneInfos, ref Dictionary<int, Transform> bonesTransformByIndex)
{
DeltaTime = deltaTime;
if (CurrentAnimation != null)
{
// CurrentTime = deltaTime;
CalculateBoneTransform();
CalculateBoneTransform(boneInfos, ref bonesTransformByIndex);
}
}

public void CalculateBoneTransform()
public void CalculateBoneTransform(FMeshBoneInfo[] boneInfos, ref Dictionary<int, Transform> bonesTransformByIndex)
{
var sequence = CurrentAnimation.Sequences[0];
for (int boneIndex = 0; boneIndex < FinalBonesMatrix.Length; boneIndex++)
for (int boneIndex = 0; boneIndex < boneInfos.Length; boneIndex++)
{
var boneOrientation = FQuat.Identity;
var bonePosition = FVector.ZeroVector;
var boneScale = FVector.OneVector;
sequence.Tracks[boneIndex].GetBonePosition(CurrentTime, sequence.NumFrames, false, ref bonePosition, ref boneOrientation);
if (CurrentTime < sequence.Tracks[boneIndex].KeyScale.Length)
boneScale = sequence.Tracks[boneIndex].KeyScale[CurrentTime];

if (!bonesTransformByIndex.TryGetValue(boneInfos[boneIndex].ParentIndex, out var parentTransform))
parentTransform = new Transform { Relation = Matrix4x4.Identity };

FinalBonesMatrix[boneIndex].Rotation = boneOrientation;
FinalBonesMatrix[boneIndex].Position = bonePosition * Constants.SCALE_DOWN_RATIO;
bonesTransformByIndex[boneIndex] = new Transform
{
Relation = parentTransform.Matrix,
Rotation = boneOrientation,
Position = bonePosition * Constants.SCALE_DOWN_RATIO,
Scale = boneScale
};
}
}

Expand Down
14 changes: 8 additions & 6 deletions FModel/Views/Snooper/Models/Animations/Skeleton.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ public class Skeleton : IDisposable
public readonly USkeleton UnrealSkeleton;
public readonly FReferenceSkeleton ReferenceSkeleton;
public readonly Dictionary<string, int> BonesIndexByName;
public readonly Dictionary<int, Transform> BonesTransformByIndex;
public Dictionary<int, Transform> BonesTransformByIndex;
public readonly bool IsLoaded;

public Animation Anim;
Expand All @@ -27,22 +27,23 @@ public Skeleton()
public Skeleton(FPackageIndex package, FReferenceSkeleton referenceSkeleton, Transform transform) : this()
{
UnrealSkeleton = package.Load<USkeleton>();
if (UnrealSkeleton == null) return;
IsLoaded = UnrealSkeleton != null;
if (!IsLoaded) return;

ReferenceSkeleton = referenceSkeleton ?? UnrealSkeleton.ReferenceSkeleton;
BonesIndexByName = ReferenceSkeleton.FinalNameToIndexMap;
BonesTransformByIndex = new Dictionary<int, Transform>();
UpdateBoneMatrices(transform.Matrix);
IsLoaded = true;
}

public void SetAnimation(CAnimSet anim)
{
Anim = new Animation(anim, BonesIndexByName, BonesTransformByIndex);
Anim = new Animation(anim);
}

public void UpdateBoneMatrices(Matrix4x4 matrix)
{
if (!IsLoaded) return;
foreach (var boneIndex in BonesIndexByName.Values)
{
var bone = ReferenceSkeleton.FinalRefBonePose[boneIndex];
Expand All @@ -69,9 +70,10 @@ public void UpdateBoneMatrices(Matrix4x4 matrix)
public void SetUniform(Shader shader)
{
if (!IsLoaded) return;
for (var i = 0; i < Anim?.FinalBonesMatrix.Length; i++)
Anim?.UpdateAnimation(ReferenceSkeleton.FinalRefBoneInfo, ref BonesTransformByIndex);
foreach ((int boneIndex, Transform boneTransform) in BonesTransformByIndex)
{
shader.SetUniform($"uFinalBonesMatrix[{i}]", Anim.FinalBonesMatrix[i].Matrix);
shader.SetUniform($"uFinalBonesMatrix[{boneIndex}]", boneTransform.Matrix);
}
}

Expand Down
1 change: 1 addition & 0 deletions FModel/Views/Snooper/Models/Model.cs
Original file line number Diff line number Diff line change
Expand Up @@ -362,6 +362,7 @@ public void Render(Shader shader, bool outline = false)
shader.SetUniform("uMorphTime", MorphTime);
if (!outline)
{
// if (HasSkeleton) Skeleton.SetUniform(shader);
shader.SetUniform("uUvCount", UvCount);
shader.SetUniform("uHasVertexColors", HasVertexColors);
}
Expand Down
22 changes: 17 additions & 5 deletions FModel/Views/Snooper/Renderer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -231,7 +231,7 @@ private void LoadWorld(CancellationToken cancellationToken, UWorld original, Tra

Services.ApplicationService.ApplicationView.Status.UpdateStatusLabel($"{original.Name} ... {i}/{length}");
WorldCamera(actor);
// WorldLight(actor);
WorldLight(actor);
WorldMesh(actor, transform);
AdditionalWorlds(actor, transform.Matrix, cancellationToken);
}
Expand All @@ -250,10 +250,22 @@ private void WorldCamera(UObject actor)

private void WorldLight(UObject actor)
{
// if (!actor.TryGetValue(out FPackageIndex lightComponent, "LightComponent") ||
// lightComponent.Load() is not { } lightObject) return;
//
// Cache.Lights.Add(new PointLight(Cache.Icons["pointlight"], lightObject, FVector.ZeroVector));
if (!actor.TryGetValue(out FPackageIndex lightComponent, "LightComponent") ||
lightComponent.Load() is not { } lightObject) return;

switch (actor.ExportType)
{
case "PointLight":
Options.Lights.Add(new PointLight(Options.Icons["pointlight"], lightObject));
break;
case "SpotLight":
Options.Lights.Add(new SpotLight(Options.Icons["spotlight"], lightObject));
break;
case "RectLight":
case "SkyLight":
case "DirectionalLight":
break;
}
}

private void WorldMesh(UObject actor, Transform transform)
Expand Down
16 changes: 11 additions & 5 deletions FModel/Views/Snooper/SnimGui.cs
Original file line number Diff line number Diff line change
Expand Up @@ -158,11 +158,14 @@ private void DrawWorld(Snooper s)
{
for (int i = 0; i < s.Renderer.Options.Lights.Count; i++)
{
var id = $"[{i}] {s.Renderer.Options.Models[s.Renderer.Options.Lights[i].Model].Name}";
var light = s.Renderer.Options.Lights[i];
var id = s.Renderer.Options.TryGetModel(light.Model, out var lightModel) ? lightModel.Name : "None";

id += $"##{i}";
if (ImGui.TreeNode(id) && ImGui.BeginTable(id, 2))
{
s.Renderer.Options.SelectModel(s.Renderer.Options.Lights[i].Model);
s.Renderer.Options.Lights[i].ImGuiLight();
s.Renderer.Options.SelectModel(light.Model);
light.ImGuiLight();
ImGui.EndTable();
ImGui.TreePop();
}
Expand Down Expand Up @@ -341,8 +344,7 @@ private void DrawOuliner(Snooper s)
_saver.Value = model.TrySave(out _saver.Label, out _saver.Path);
s.WindowShouldFreeze(false);
}
ImGui.BeginDisabled(true);
// ImGui.BeginDisabled(!model.HasSkeleton);
ImGui.BeginDisabled(!model.HasSkeleton);
if (ImGui.Selectable("Animate"))
{
s.Renderer.Options.AnimateMesh(true);
Expand Down Expand Up @@ -444,6 +446,10 @@ private void DrawDetails(Snooper s)
Layout("Guid");ImGui.Text($" : {s.Renderer.Options.SelectedModel.ToString(EGuidFormats.UniqueObjectGuid)}");
if (model.HasSkeleton)
{
if (model.Skeleton.Anim != null)
{
ImGui.DragInt("Time", ref model.Skeleton.Anim.CurrentTime, 1, 0, 110);
}
Layout("Skeleton");ImGui.Text($" : {model.Skeleton.UnrealSkeleton.Name}");
Layout("Bones");ImGui.Text($" : x{model.Skeleton.UnrealSkeleton.BoneTree.Length}");
}
Expand Down
2 changes: 2 additions & 0 deletions FModel/Views/Snooper/Transform.cs
Original file line number Diff line number Diff line change
Expand Up @@ -74,4 +74,6 @@ public void ImGuiTransform(float speed)
ImGui.TreePop();
}
}

public override string ToString() => Matrix.Translation.ToString();
}

0 comments on commit 481d9d3

Please sign in to comment.