Skip to content

Commit efdcbff

Browse files
committed
Track child buffer structs
Fix FVoxelUtilities::CleanupRedirects Fix using Get Voxel Metadata in functions
1 parent c013927 commit efdcbff

File tree

4 files changed

+156
-32
lines changed

4 files changed

+156
-32
lines changed

Source/VoxelCore/Private/VoxelMaterialGenerator.cpp

+43-27
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,37 @@
1717
#endif
1818

1919
#if WITH_EDITOR
20-
TVoxelOptional<FMaterialAttributesInput> FVoxelMaterialGenerator::CopyExpressions()
20+
UMaterialFunction* FVoxelMaterialGenerator::DuplicateFunctionIfNeeded(const UMaterialFunction& OldFunction)
21+
{
22+
VOXEL_FUNCTION_COUNTER();
23+
24+
if (!ShouldDuplicateFunction(OldFunction))
25+
{
26+
return ConstCast(&OldFunction);
27+
}
28+
29+
if (UMaterialFunction* NewFunction = OldToNewFunction.FindRef(&OldFunction))
30+
{
31+
return NewFunction;
32+
}
33+
34+
UMaterialFunction* NewFunction = NewObject<UMaterialFunction>(&NewMaterial);
35+
NewFunction->UserExposedCaption =
36+
"GENERATED: " +
37+
(OldFunction.UserExposedCaption.IsEmpty() ? OldFunction.GetName() : OldFunction.UserExposedCaption);
38+
39+
OldToNewFunction.Add_EnsureNew(&OldFunction, NewFunction);
40+
41+
if (!ensureVoxelSlow(CopyFunctionExpressions(OldFunction, *NewFunction)))
42+
{
43+
return nullptr;
44+
}
45+
46+
NewFunction->UpdateDependentFunctionCandidates();
47+
return NewFunction;
48+
}
49+
50+
TVoxelOptional<FMaterialAttributesInput> FVoxelMaterialGenerator::CopyExpressions(const UMaterial& OldMaterial)
2151
{
2252
VOXEL_FUNCTION_COUNTER();
2353

@@ -225,20 +255,26 @@ bool FVoxelMaterialGenerator::ShouldDuplicateFunction(const UMaterialFunction& F
225255

226256
const bool bValue = INLINE_LAMBDA
227257
{
228-
for (UMaterialExpression* FunctionExpression : Function.GetExpressions())
258+
for (UMaterialExpression* Expression : Function.GetExpressions())
229259
{
230-
if (!FunctionExpression)
260+
if (!Expression)
231261
{
232262
continue;
233263
}
234264

235265
if (!ParameterNamePrefix.IsEmpty() &&
236-
FunctionExpression->HasAParameterName())
266+
Expression->HasAParameterName())
237267
{
238268
return true;
239269
}
240270

241-
if (const UMaterialExpressionMaterialFunctionCall* FunctionCall = Cast<UMaterialExpressionMaterialFunctionCall>(FunctionExpression))
271+
if (ShouldDuplicateFunction_AdditionalHook &&
272+
ShouldDuplicateFunction_AdditionalHook(*Expression))
273+
{
274+
return true;
275+
}
276+
277+
if (const UMaterialExpressionMaterialFunctionCall* FunctionCall = Cast<UMaterialExpressionMaterialFunctionCall>(Expression))
242278
{
243279
if (!FunctionCall->MaterialFunction)
244280
{
@@ -333,33 +369,13 @@ bool FVoxelMaterialGenerator::PostCopyExpression(UMaterialExpression& Expression
333369
return true;
334370
}
335371

336-
if (!ShouldDuplicateFunction(*OldFunction))
337-
{
338-
return true;
339-
}
340-
341-
if (UMaterialFunction* NewFunction = OldToNewFunction.FindRef(OldFunction))
342-
{
343-
FunctionCall->MaterialFunction = NewFunction;
344-
return true;
345-
}
346-
347-
UMaterialFunction* NewFunction = NewObject<UMaterialFunction>(&NewMaterial);
348-
NewFunction->UserExposedCaption =
349-
"GENERATED: " +
350-
(OldFunction->UserExposedCaption.IsEmpty() ? OldFunction->GetName() : OldFunction->UserExposedCaption);
351-
352-
OldToNewFunction.Add_EnsureNew(OldFunction, NewFunction);
353-
354-
if (!ensureVoxelSlow(CopyFunctionExpressions(*OldFunction, *NewFunction)))
372+
UMaterialFunction* NewFunction = DuplicateFunctionIfNeeded(*OldFunction);
373+
if (!ensureVoxelSlow(NewFunction))
355374
{
356375
return false;
357376
}
358377

359-
NewFunction->UpdateDependentFunctionCandidates();
360-
361378
FunctionCall->MaterialFunction = NewFunction;
362-
363379
return true;
364380
}
365381
#endif

Source/VoxelCore/Private/VoxelMinimal/Utilities/VoxelMaterialUtilities.cpp

+98
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,13 @@ UMaterialExpression& FVoxelUtilities::CreateMaterialExpression(
140140
check(false);
141141
return *GetMutableDefault<UMaterialExpression>();
142142
}
143+
#endif
144+
145+
///////////////////////////////////////////////////////////////////////////////
146+
///////////////////////////////////////////////////////////////////////////////
147+
///////////////////////////////////////////////////////////////////////////////
143148

149+
#if WITH_EDITOR
144150
TVoxelArray<UMaterialExpression*> FVoxelUtilities::GetMaterialExpressions(const UMaterial& Material)
145151
{
146152
VOXEL_FUNCTION_COUNTER();
@@ -223,6 +229,98 @@ TVoxelArray<UMaterialExpression*> FVoxelUtilities::GetMaterialExpressions(const
223229
return Expressions;
224230
}
225231

232+
TVoxelArray<UMaterialExpression*> FVoxelUtilities::GetMaterialExpressions_Recursive(
233+
const UMaterial& Material,
234+
TVoxelSet<const UObject*>* Visited)
235+
{
236+
VOXEL_FUNCTION_COUNTER();
237+
238+
TVoxelSet<const UObject*> VisitedAllocation;
239+
if (!Visited)
240+
{
241+
Visited = &VisitedAllocation;
242+
}
243+
244+
if (Visited->Contains(&Material))
245+
{
246+
return {};
247+
}
248+
Visited->Add_EnsureNew(&Material);
249+
250+
TVoxelArray<UMaterialExpression*> Result;
251+
Result.Reserve(1024);
252+
253+
for (UMaterialExpression* Expression : GetMaterialExpressions(Material))
254+
{
255+
Result.Add(Expression);
256+
257+
const UMaterialExpressionMaterialFunctionCall* FunctionCall = Cast<UMaterialExpressionMaterialFunctionCall>(Expression);
258+
if (!FunctionCall)
259+
{
260+
continue;
261+
}
262+
263+
const UMaterialFunction* Function = Cast<UMaterialFunction>(FunctionCall->MaterialFunction);
264+
if (!Function)
265+
{
266+
continue;
267+
}
268+
269+
Result.Append(GetMaterialExpressions_Recursive(*Function, Visited));
270+
}
271+
272+
return Result;
273+
}
274+
275+
TVoxelArray<UMaterialExpression*> FVoxelUtilities::GetMaterialExpressions_Recursive(
276+
const UMaterialFunction& MaterialFunction,
277+
TVoxelSet<const UObject*>* Visited)
278+
{
279+
VOXEL_FUNCTION_COUNTER();
280+
281+
TVoxelSet<const UObject*> VisitedAllocation;
282+
if (!Visited)
283+
{
284+
Visited = &VisitedAllocation;
285+
}
286+
287+
if (Visited->Contains(&MaterialFunction))
288+
{
289+
return {};
290+
}
291+
Visited->Add_EnsureNew(&MaterialFunction);
292+
293+
TVoxelArray<UMaterialExpression*> Result;
294+
Result.Reserve(1024);
295+
296+
for (UMaterialExpression* Expression : GetMaterialExpressions(MaterialFunction))
297+
{
298+
Result.Add(Expression);
299+
300+
const UMaterialExpressionMaterialFunctionCall* FunctionCall = Cast<UMaterialExpressionMaterialFunctionCall>(Expression);
301+
if (!FunctionCall)
302+
{
303+
continue;
304+
}
305+
306+
const UMaterialFunction* Function = Cast<UMaterialFunction>(FunctionCall->MaterialFunction);
307+
if (!Function)
308+
{
309+
continue;
310+
}
311+
312+
Result.Append(GetMaterialExpressions_Recursive(*Function, Visited));
313+
}
314+
315+
return Result;
316+
}
317+
#endif
318+
319+
///////////////////////////////////////////////////////////////////////////////
320+
///////////////////////////////////////////////////////////////////////////////
321+
///////////////////////////////////////////////////////////////////////////////
322+
323+
#if WITH_EDITOR
226324
void FVoxelUtilities::ClearMaterialExpressions(UMaterial& Material)
227325
{
228326
VOXEL_FUNCTION_COUNTER();

Source/VoxelCore/Public/VoxelMaterialGenerator.h

+6-5
Original file line numberDiff line numberDiff line change
@@ -13,31 +13,32 @@ class VOXELCORE_API FVoxelMaterialGenerator
1313
public:
1414
FVoxelMaterialGenerator(
1515
const TVoxelObjectPtr<const UObject> ErrorOwner,
16-
const UMaterial& OldMaterial,
1716
UMaterial& NewMaterial,
1817
const FString& ParameterNamePrefix,
19-
const bool bSkipCustomOutputs)
18+
const bool bSkipCustomOutputs,
19+
const TFunction<bool(const UMaterialExpression&)> ShouldDuplicateFunction_AdditionalHook)
2020
: ErrorOwner(ErrorOwner)
21-
, OldMaterial(OldMaterial)
2221
, NewMaterial(NewMaterial)
2322
, ParameterNamePrefix(ParameterNamePrefix)
2423
, bSkipCustomOutputs(bSkipCustomOutputs)
24+
, ShouldDuplicateFunction_AdditionalHook(ShouldDuplicateFunction_AdditionalHook)
2525
{
2626
}
2727

2828
public:
29-
TVoxelOptional<FMaterialAttributesInput> CopyExpressions();
29+
UMaterialFunction* DuplicateFunctionIfNeeded(const UMaterialFunction& OldFunction);
30+
TVoxelOptional<FMaterialAttributesInput> CopyExpressions(const UMaterial& OldMaterial);
3031

3132
public:
3233
FVoxelOptionalIntBox2D GetBounds() const;
3334
void MoveExpressions(const FIntPoint& Offset) const;
3435

3536
private:
3637
const TVoxelObjectPtr<const UObject> ErrorOwner;
37-
const UMaterial& OldMaterial;
3838
UMaterial& NewMaterial;
3939
const FString ParameterNamePrefix;
4040
const bool bSkipCustomOutputs;
41+
const TFunction<bool(const UMaterialExpression&)> ShouldDuplicateFunction_AdditionalHook;
4142

4243
TVoxelMap<FGuid, FGuid> OldToNewParameterGuid;
4344
TVoxelMap<FGuid, FGuid> OldToNewNamedRerouteGuid;

Source/VoxelCore/Public/VoxelMinimal/Utilities/VoxelMaterialUtilities.h

+9
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#pragma once
44

55
#include "VoxelCoreMinimal.h"
6+
#include "VoxelMinimal/Containers/VoxelSet.h"
67
#include "VoxelMinimal/Containers/VoxelArray.h"
78

89
class FMaterialCompiler;
@@ -46,6 +47,14 @@ namespace FVoxelUtilities
4647
VOXELCORE_API TVoxelArray<UMaterialExpression*> GetMaterialExpressions(const UMaterial& Material);
4748
VOXELCORE_API TVoxelArray<UMaterialExpression*> GetMaterialExpressions(const UMaterialFunction& MaterialFunction);
4849

50+
VOXELCORE_API TVoxelArray<UMaterialExpression*> GetMaterialExpressions_Recursive(
51+
const UMaterial& Material,
52+
TVoxelSet<const UObject*>* Visited = nullptr);
53+
54+
VOXELCORE_API TVoxelArray<UMaterialExpression*> GetMaterialExpressions_Recursive(
55+
const UMaterialFunction& MaterialFunction,
56+
TVoxelSet<const UObject*>* Visited = nullptr);
57+
4958
VOXELCORE_API void ClearMaterialExpressions(UMaterial& Material);
5059

5160
VOXELCORE_API bool CopyParameterValues(

0 commit comments

Comments
 (0)