Skip to content

Commit 771a421

Browse files
committed
Blueprint factory function added
1 parent 44bb120 commit 771a421

File tree

4 files changed

+72
-5
lines changed

4 files changed

+72
-5
lines changed

Examples/Content/Scripts/helloJS.js

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -119,9 +119,11 @@
119119
}
120120
Drop(event) {
121121
sprite.SetVisibility('Hidden')
122+
console.log('ok')
122123
}
123124
DragCancelled(event) {
124125
sprite.SetVisibility('Hidden')
126+
console.log('cancel')
125127
}
126128
}
127129
let DragOp_C = uclass(DragOp)
@@ -137,7 +139,7 @@
137139
let op = WidgetBlueprintLibrary.CreateDragDropOperation(DragOp_C)
138140
sprite.SetVisibility('Visible')
139141
return {
140-
$: WidgetBlueprintLibrary.Handled(),
142+
$: EventReply.Handled(),
141143
Operation: op
142144
}
143145
}
@@ -156,7 +158,7 @@
156158
}
157159
OnDrop(x) {
158160
console.log('dropped',x)
159-
return WidgetBlueprintLibrary.Handled()
161+
return EventReply.Handled()
160162
}
161163
}
162164
let MyDraggable_C = uclass(MyDraggable)
@@ -171,7 +173,10 @@
171173
UMG(Border,{BrushColor:{R:1,A:0.5}},"Drop target")
172174
)
173175
),
174-
UMG(CanvasPanel,{'Slot.HorizontalAlignment':'HAlign_Fill','Slot.VerticalAlignment':'VAlign_Fill'},
176+
UMG(CanvasPanel,{
177+
'Visibility':'HitTestInvisible',
178+
'Slot.HorizontalAlignment':'HAlign_Fill','Slot.VerticalAlignment':'VAlign_Fill'
179+
},
175180
UMG(Border,{Visibility:'Hidden',$link:elem => sprite = elem})
176181
)
177182
)

Plugins/UnrealJS/Source/V8/Private/JavascriptIsolate_Private.cpp

Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -402,6 +402,13 @@ class FJavascriptIsolateImplementation : public FJavascriptIsolate
402402
BlueprintFunctionLibraryMapping.Add(p->Struct, Function);
403403
}
404404
}
405+
else if ((Function->FunctionFlags & FUNC_Static) && It && (It->PropertyFlags & (CPF_Parm | CPF_ReturnParm)) == (CPF_Parm | CPF_ReturnParm))
406+
{
407+
if (auto p = Cast<UStructProperty>(*It))
408+
{
409+
BlueprintFunctionLibraryFactoryMapping.Add(p->Struct, Function);
410+
}
411+
}
405412
}
406413
}
407414
}
@@ -1162,7 +1169,48 @@ class FJavascriptIsolateImplementation : public FJavascriptIsolate
11621169

11631170
// Register the function to prototype template
11641171
Template->PrototypeTemplate()->Set(function_name, function);
1165-
}
1172+
}
1173+
1174+
void ExportBlueprintLibraryFactoryFunction(Handle<FunctionTemplate> Template, UFunction* FunctionToExport)
1175+
{
1176+
FIsolateHelper I(isolate_);
1177+
1178+
// Exposed function body (it doesn't capture anything)
1179+
auto FunctionBody = [](const FunctionCallbackInfo<Value>& info)
1180+
{
1181+
auto isolate = info.GetIsolate();
1182+
1183+
auto self = info.Holder();
1184+
1185+
// Retrieve "FUNCTION"
1186+
auto Function = reinterpret_cast<UFunction*>((Local<External>::Cast(info.Data()))->Value());
1187+
1188+
// 'this' should be CDO of owner class
1189+
auto Object = Function->GetOwnerClass()->ClassDefaultObject;
1190+
1191+
info.GetReturnValue().Set(
1192+
// Call unreal engine function!
1193+
CallFunction(isolate, self, Function, Object, [&](int ArgIndex) -> Local<Value> {
1194+
// pass an argument if we have
1195+
if (ArgIndex < info.Length())
1196+
{
1197+
return info[ArgIndex];
1198+
}
1199+
// Otherwise, just return undefined.
1200+
else
1201+
{
1202+
return Undefined(isolate);
1203+
}
1204+
})
1205+
);
1206+
};
1207+
1208+
auto function_name = I.Keyword(FV8Config::Safeify(FunctionToExport->GetName()));
1209+
auto function = I.FunctionTemplate(FunctionBody, FunctionToExport);
1210+
1211+
// Register the function to prototype template
1212+
Template->Set(function_name, function);
1213+
}
11661214

11671215
template <typename PropertyAccessors>
11681216
void ExportProperty(Handle<FunctionTemplate> Template, UProperty* PropertyToExport, int32 PropertyIndex)
@@ -1211,6 +1259,12 @@ class FJavascriptIsolateImplementation : public FJavascriptIsolate
12111259
{
12121260
ExportBlueprintLibraryFunction(Template, Function);
12131261
}
1262+
1263+
BlueprintFunctionLibraryFactoryMapping.MultiFind(ClassToExport, Functions);
1264+
for (auto Function : Functions)
1265+
{
1266+
ExportBlueprintLibraryFactoryFunction(Template, Function);
1267+
}
12141268
}
12151269

12161270
void AddMemberFunction_Class_GetClassObject(Local<FunctionTemplate> Template, UStruct* ClassToExport)

Plugins/UnrealJS/Source/V8/Private/JavascriptIsolate_Private.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ class FJavascriptIsolate
2929
/** BlueprintFunctionLibrary function mapping */
3030
TMultiMap< const UStruct*, UFunction*> BlueprintFunctionLibraryMapping;
3131

32+
TMultiMap< const UStruct*, UFunction*> BlueprintFunctionLibraryFactoryMapping;
33+
3234
TArray<FPendingClassConstruction> ObjectUnderConstructionStack;
3335

3436
v8::Isolate* isolate_;

Plugins/UnrealJS/Source/V8/Private/TypingGenerator.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -297,7 +297,7 @@ struct TypingGenerator : TypingGeneratorBase
297297
w.push(";\n");
298298
}
299299

300-
auto write_function = [&](UFunction* Function, bool is_thunk) {
300+
auto write_function = [&](UFunction* Function, bool is_thunk, bool is_factory = false) {
301301
w.tooltip("\t", Function);
302302

303303
w.push("\t");
@@ -455,6 +455,12 @@ struct TypingGenerator : TypingGeneratorBase
455455
{
456456
write_function(Function, true);
457457
}
458+
459+
Environment.BlueprintFunctionLibraryFactoryMapping.MultiFind(source, Functions);
460+
for (auto Function : Functions)
461+
{
462+
write_function(Function, false, true);
463+
}
458464
}
459465

460466
w.push("}\n\n");

0 commit comments

Comments
 (0)