MeshRendererComponentEditor

- Explicit conversion from VectorX to float[X]
- Expose "Columns" and "Rows" properties of BufferVariable
- Effects: VariableDescriptors
This commit is contained in:
Simon Lübeß
2022-05-10 22:29:40 +02:00
parent 2e0cc289df
commit f4c9dd8ade
10 changed files with 387 additions and 72 deletions
+11 -2
View File
@@ -23,13 +23,22 @@ cbuffer SceneConstants
cbuffer ObjectConstants
{
float4x4 Transform;
/**
* \brief Inverted and transposed transform matrix.
* \remarks This matrix is used in order to correctly transform normal vectors.
*/
float3x3 Transform_InvT;
}
cbuffer Constants
{
#EditorVariable{ Name = "AlbedoColor"; Preview = "Albedo Color"; Type="Color" }
float4 AlbedoColor = float4(1.0, 1.0, 1.0, 1.0);
#EditorVariable{ Name = "NormalScaling"; Preview = "Normal Scaling" }
float2 NormalScaling = float2(1.0, 1.0);
#EditorVariable{ Name = "MetallicFactor"; Preview = "Metallic Factor"; Min = 0.0f; Max = 1.0f }
float MetallicFactor = 1.0;
#EditorVariable{ Name = "RoughnessFactor"; Preview = "Rougness Factor"; Min = 0.0f; Max = 1.0f }
float RoughnessFactor = 1.0;
// float AmbientFactor = 1.0;
}
@@ -62,7 +71,7 @@ PS_IN VS(VS_IN input)
output.Position = mul(ViewProjection, worldPosition);
output.WorldPosition = worldPosition.xyz / worldPosition.w;
output.Normal = mul(input.Normal, (float3x3)Transform);
output.Normal = mul(Transform_InvT, input.Normal);
output.Tangent = mul((float3x3)Transform, input.Tangent);
// TODO: output.Handedness = input.Tangent.w
@@ -91,7 +100,7 @@ PS_OUT PS(PS_IN input)
// TODO: float3 bitangent = input.Handedness * cross(normal, tangent);
float3 bitangent = -cross(normal, tangent);
float3x3 tangentTransform = float3x3(tangent, bitangent, normal);
//float3x3 tangentTransform = float3x3(tangent, bitangent, normal);
//tangentTransform = transpose(tangentTransform);
float4 texAlbedo = AlbedoTexture.Sample(AlbedoSampler, input.TexCoord);
@@ -3,6 +3,8 @@ using GlitchyEngine.World;
using System;
using GlitchyEngine.Math;
using System.Collections;
using GlitchyEngine.Renderer;
using GlitchyEngine;
namespace GlitchyEditor.EditWindows
{
@@ -58,6 +60,7 @@ namespace GlitchyEditor.EditWindows
ShowComponentEditor<TransformComponent>("Transform", entity, => ShowTransformComponentEditor);
ShowComponentEditor<CameraComponent>("Camera", entity, => ShowCameraComponentEditor, => ShowComponentContextMenu<CameraComponent>);
ShowComponentEditor<SpriterRendererComponent>("Sprite Renderer", entity, => ShowSpriteRendererComponentEditor, => ShowComponentContextMenu<SpriterRendererComponent>);
ShowComponentEditor<MeshRendererComponent>("Mesh Renderer", entity, => ShowMeshRendererComponentEditor, => ShowComponentContextMenu<MeshRendererComponent>);
ShowAddComponentButton(entity);
}
@@ -246,6 +249,106 @@ namespace GlitchyEditor.EditWindows
ImGui.ColorEdit4("Color", ref spriteRendererComponent.Color);
}
private static void ShowMeshRendererComponentEditor(Entity entity, MeshRendererComponent* meshRendererComponent)
{
// TODO: Editing material options obviously shouldn't be part of the meshrenderer-ui
Material material = meshRendererComponent.Material;
Effect effect = material.Effect;
bool TryGetValue(Dictionary<String, Variant> parameters, String name, out Variant value)
{
if (parameters.TryGetValue(name, let param))
{
value = param;
return true;
}
value = ?;
return false;
}
for (let texture in effect.Textures)
{
ImGui.Text(texture.key);
}
for (let (name, arguments) in effect.[Friend]_variableDescriptions)
{
let variable = effect.Variables[name];
bool hasPreviewName = TryGetValue(arguments, "Preview", var previewName);
StringView displayName = hasPreviewName ? previewName.Get<String>() : name;
bool hasPreviewType = TryGetValue(arguments, "Type", var previewType);
if (hasPreviewType && previewType.Get<String>() == "Color")
{
Log.EngineLogger.AssertDebug(variable.Type == .Float && variable.Rows == 1);
if (variable.Columns == 3)
{
material.GetVariable<Vector3>(variable.Name, var value);
if (ImGui.ColorEdit3(displayName.Ptr, *(float[3]*)&value))
material.SetVariable(variable.Name, value);
}
else if (variable.Columns == 4)
{
material.GetVariable<Vector4>(variable.Name, var value);
if (ImGui.ColorEdit4(displayName.Ptr, *(float[4]*)&value))
material.SetVariable(variable.Name, value);
}
}
else if (variable.Type == .Float && variable.Rows == 1)
{
bool hasMin = TryGetValue(arguments, "Min", var min);
bool hasMax = TryGetValue(arguments, "Max", var max);
for (int r < variable.Rows)
{
switch (variable.Columns)
{
case 1:
material.GetVariable<float>(variable.Name, var value);
float[1] minV = hasMin ? min.Get<float[1]>() : .(float.MinValue);
float[1] maxV = hasMax ? max.Get<float[1]>() : .(float.MaxValue);
if (ImGui.EditVector<1>(displayName, ref *(float[1]*)&value, .(), 0.1f, 100.0f, minV, maxV))
material.SetVariable(variable.Name, value);
case 2:
material.GetVariable<Vector2>(variable.Name, var value);
Vector2 minV = hasMin ? min.Get<Vector2>() : .(float.MinValue);
Vector2 maxV = hasMax ? max.Get<Vector2>() : .(float.MaxValue);
if (ImGui.EditVector2(displayName, ref value, .Zero, 0.1f, 100.0f, minV, maxV))
material.SetVariable(variable.Name, value);
case 3:
material.GetVariable<Vector3>(variable.Name, var value);
Vector3 minV = hasMin ? min.Get<Vector3>() : .(float.MinValue);
Vector3 maxV = hasMax ? max.Get<Vector3>() : .(float.MaxValue);
if (ImGui.EditVector3(displayName, ref value, .Zero, 0.1f, 100.0f, minV, maxV))
material.SetVariable(variable.Name, value);
case 4:
material.GetVariable<Vector4>(variable.Name, var value);
Vector4 minV = hasMin ? min.Get<Vector4>() : .(float.MinValue);
Vector4 maxV = hasMax ? max.Get<Vector4>() : .(float.MaxValue);
if (ImGui.EditVector4(displayName, ref value, .Zero, 0.1f, 100.0f, minV, maxV))
material.SetVariable(variable.Name, value);
}
}
}
}
}
private static void ShowAddComponentButton(Entity entity)
{
static char8[128] searchBuffer = .();