虚幻引擎程序化资源生成框架PCG 之 UPCGBlueprintElement源码笔记(一)

2023-11-19

UPCGBlueprintElement是PCGGraph中自定义节点的基类,但官方目前还没有给出详细的文档,所以从源代码里找点答案。

在这里插入图片描述

可覆盖函数(Override Functions)

在这里插入图片描述

UPCGBlueprintElement是PCGGraph中所有自定义节点的基类,有如下几个可供蓝图覆盖的函数:

  • Excute
  • Excute with Context
  • Iteration Loop Body
  • Point Loop Body
  • Variable Loop Body
  • Nested Loop Body
  • Node Color Override
  • Node Title Override
  • Node Type Override

其中 ExcuteExcute with ContextNodeTitleOverrideNodeColorOverrideNodeTypeOverride是覆盖后被自动触发的;而剩余的几个“Loop Body函数”则需要在蓝图中显示调用对应的“Loop函数”才可以执行循环,比如:要调用PointLoop才可以执行Point Loop Body

Excute 和 Excute with Context

这两个函数可以理解为自定义节点的“主函数”,区别就是一个有PCGContext输入另一个没有,ExecuteWithContext会调用Execute

Excute

	UFUNCTION(BlueprintImplementableEvent, BlueprintCallable, Category = "PCG|Execution")
	void Execute(const FPCGDataCollection& Input, FPCGDataCollection& Output);

Excute with Context

	UFUNCTION(BlueprintNativeEvent, Category = "PCG|Execution")
	void ExecuteWithContext(UPARAM(ref)FPCGContext& InContext, const FPCGDataCollection& Input, FPCGDataCollection& Output);
void UPCGBlueprintElement::ExecuteWithContext_Implementation(FPCGContext& InContext, const FPCGDataCollection& Input, FPCGDataCollection& Output)
{
	Execute(Input, Output);
}

其实还有个C++ 函数ExecuteInternalExcute with Context是由它调用的。

virtual bool ExecuteInternal(FPCGContext* Context) const override;
	/** Finally, execute the actual blueprint */
		Context->BlueprintElementInstance->ExecuteWithContext(*Context, Context->InputData, Context->OutputData);

Loop Body函数和Loop函数

在这里插入图片描述

Loop Body函数都是在Loop函数中定义的lambda表达式调用的。

  • Point Loop BodyNested Loop BodyIteration Loop Body通过FPCGAsync::AsyncPointProcessing调用;
  • Variable Loop Body通过FPCGAsync::AsyncMultiPointProcessing调用
  • 上述节点中的各种Data参数都是PCGPointData类型,需要的话可以在调用Loop函数的时候传入,它们会直接传入Loop Body函数

Point Loop Body和PointLoop

Point Loop Body需要通过PointLoop执行循环

Point Loop Body
在这里插入图片描述

PointLoop

	FPCGAsync::AsyncPointProcessing(&InContext, InPoints.Num(), OutPoints, [this, &InContext, InData, OutData, &InPoints](int32 Index, FPCGPoint& OutPoint)
	{
		return PointLoopBody(InContext, InData, InPoints[Index], OutPoint, OutData->Metadata);
	});

Variable Loop Body和VariableLoop

Variable Loop Body需要通过VariableLoop执行循环

在这里插入图片描述

VariableLoop

	FPCGAsync::AsyncMultiPointProcessing(&InContext, InPoints.Num(), OutPoints, [this, &InContext, InData, OutData, &InPoints](int32 Index)
	{
		return VariableLoopBody(InContext, InData, InPoints[Index], OutData->Metadata);
	});
}

FPCGAsync::AsyncPointProcessingFPCGAsync::AsyncMultiPointProcessing都是异步的,它们的区别就在于处理输入:输出为1:1还是1:N的循环。Point Loop BodyVariableLoopBody,前者输入一个point返回一个point;后者输入一个point可以返回一个point的数组。比如:如果你想把一个point看作一块地基,想在它的垂直上方再生成一串点作为楼层,然后把这些点返回,那么你就需要用到VariableLoopBody

Nested Loop Body和NestedLoop

Nested Loop Body需要通过NestedLoop执行循环

在这里插入图片描述
关键代码如下,但使用情景没想明白。

NestedLoop

	const TArray<FPCGPoint>& InOuterPoints = InOuterData->GetPoints();
	const TArray<FPCGPoint>& InInnerPoints = InInnerData->GetPoints();
	TArray<FPCGPoint>& OutPoints = OutData->GetMutablePoints();

	FPCGAsync::AsyncPointProcessing(&InContext, InOuterPoints.Num() * InInnerPoints.Num(), OutPoints, [this, &InContext, InOuterData, InInnerData, OutData, &InOuterPoints, &InInnerPoints](int32 Index, FPCGPoint& OutPoint)
	{
		return NestedLoopBody(InContext, InOuterData, InInnerData, InOuterPoints[Index / InInnerPoints.Num()], InInnerPoints[Index % InInnerPoints.Num()], OutPoint, OutData->Metadata);
	});

Iteration Loop Body和IterationLoop

Iteration Loop Body需要通过IterationLoop执行循环

在这里插入图片描述

Point Loop Body一样,但它会提供一个NumIterations用于指定迭代次数

IterationLoop

	FPCGAsync::AsyncPointProcessing(&InContext, NumIterations, OutPoints, [this, &InContext, InA, InB, OutData](int32 Index, FPCGPoint& OutPoint)
	{
		return IterationLoopBody(InContext, Index, InA, InB, OutPoint, OutData->Metadata);
	});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

虚幻引擎程序化资源生成框架PCG 之 UPCGBlueprintElement源码笔记(一) 的相关文章

  • Java:如何将ArrayList作为对象的实例变量?

    我正在开展一个班级项目 用 Java 构建一个小型 Connect4 游戏 我目前的想法是拥有一类 Columns 它具有一些整数 索引 最大长度 isFull 作为实例变量 以及一个 ArrayList 来接收上面的整数和每个玩家的表现
  • Java 中如何将 long 转换为 int?

    Java 中如何将 long 转换为 int 在 Java 8 中更新 Math toIntExact value 原答案 简单的类型转换应该可以做到 long l 100000 int i int l 但请注意 较大的数字 通常大于214
  • 知道 akka actor 何时完成

    有几个人和我一起从事一个项目 一直在试图找出解决这个问题的最佳方法 看起来这应该是经常需要的标准东西 但由于某种原因我们似乎无法得到正确的答案 如果我有一些工作要做 并且我向路由器抛出一堆消息 我如何知道所有工作何时完成 例如 如果我们正在
  • GSON:如何在保持循环引用的同时防止 StackOverflowError?

    我有一个带有循环引用的结构 出于调试目的 我想转储它 基本上任何格式都可以 但我选择了JSON 由于它可以是任何类 所以我选择了不需要 JAXB 注释的 GSON 但是 GSON 会遇到循环引用并递归直到StackOverflowError
  • 查看登录设备

    我想查看Log在设备上 即System out println 我可以查看DDMS但如何在运行时在设备屏幕上查看APK文件 还有一个适用于 Android 的 Logcat 应用程序 code google com p android ra
  • 如何在 Jboss 7.1 中配置简单身份验证

    我正在从事由以下人员编写的项目纯jsps 脚本 不使用任何框架 jboss版本 jboss as 7 1 0 Final 我现在正在尝试在其上添加简单的身份验证 因此 当用户尝试浏览 jsp 时 比如说 http localhost myC
  • Java 中修剪字符串的可能前缀

    I have String str 我想从中提取不包括可能的前缀的子字符串 abc 我想到的第一个解决方案是 if str startsWith abc return str substring abc length return str
  • Java心跳设计

    我需要在我的 Java 项目上实现一个心跳系统 3 5 个客户端和 1 个服务器 但我有一些问题 1 客户端需要有 2 个套接字吗 1 用于心跳 1 用于接收我的软件的正常消息 2 我看到在特定情况下 当客户端滞后时 客户端不会收到消息 如
  • antisamy 解析器强制关闭标签

    我使用 Antisamy 来验证 HTML 我的政策允许 iframe 例如 YouTube 视频 问题是 如果标签为空 像这样 清洗后会是这样的 但它应该有正常的结束标签 这会破坏之后页面上的所有内容 我已经将指令设置为使用大部分 HTM
  • 从壁纸中获取颜色? - 安卓

    如何找到当前壁纸的 平均 颜色并将该颜色设置为我的小部件上的布局 我正在尝试做的一个例子 这是 AccuWeather 上的设置 您可以使用WallpaperManager getWallpaperColors https develope
  • 在其抽象超类中使用子类的泛型类型?

    在我的代码中有以下抽象超类 public abstract class AbstractClass
  • 导入数据期间解析日期格式的最佳方法

    我创建了在数据导入 400 K 记录 期间解析视图不同日期格式的方法 我的方法捕获 ParseException 并尝试在不同时使用下一种格式解析日期 问题 在数据导入期间设置正确的日期格式是更好的方法 更快 吗 private stati
  • Java TreeMap时间复杂度-lowerKey

    时间复杂度是多少lowerKey Java实现中的操作TreeMap 我认为它是 log n 但我在文档中找不到它 更基本操作的复杂性已有详细记录 此实现提供了有保证的 log n 时间成本 containsKey 获取 放置和删除操作 顺
  • 需要在 java api 中的 Solr 搜索中搜索文本及其周围的几行

    我正在使用 solr 7 7 2 并且我使用 solrj 在 Solr 中编写了一个 Java 程序 该程序在一个巨大的文本文件中搜索单词 我使用以下代码来显示代表整个文本的搜索结果 SolrQuery params new SolrQue
  • 如何将 Java 字节数组转换为 Scala 字节数组?

    我是 Scala 新手 目前正在从事一个涉及 Java 和 Scala 模块的项目 现在我想使用 byte 类型的参数从 Java 调用 Scala 方法 Scala 方法的签名为 def foo data Array Byte Java
  • 什么是样板代码、热点代码和热点?

    我知道这些术语是在性能实现 优化的背景下使用的 最近一直在研究这个问题 并尝试过搜索 但没有得到任何例子 清楚地阐述 描述这些概念以及在现实世界开发场景中实现这些问题 概念 有人可以彻底解释这些术语 示例场景以及可能使用这些概念和术语的地方
  • java中类的命名约定 - 全部大写

    在 Java 中 当类全部大写时 如何命名它 例如 如果我想创建一个班级来选择某些人成为 VIP 我应该将类命名为 VIPSelector 还是 VipSelector Thanks 你的两个选择都有效 类的主要目标是让它们以大写字母开头
  • 在 Android 应用程序中编辑/添加 IPTC 元数据

    我看过许多其他类似的问题 但似乎没有一个有准确的答案 我正在开发一个可处理大量图像的 Android 应用程序 我希望通过编辑 IPTC 关键字标签 或其他适当标签 的值来向图像添加信息 我在用元数据提取器 http drewnoakes
  • 如何使用 Java 11 和 JavaFX 11 运行 ControlsFX 示例应用程序

    ControlFX 网站 http fxexperience com controlsfx says 如果您想使用 ControlsFX 示例应用程序 只需 下载 ControlsFX 版本并在上运行以下命令 命令提示符 请务必将 替换为实
  • 从 Web 服务器异步调用应用程序

    我有一个用 Spring 制作的 在 Tomcat 上运行的 Web 应用程序 在同一台机器上有一个普通的 Java 应用程序 我想通过从Web服务器调用Java应用程序来执行它 但我想让应用程序不会使用服务器的资源 它涉及分类器的训练 因

随机推荐

  • JAVA中的Runtime启动子进程并杀掉

    一 前言 最近在项目中需要将一个java工程打成一个jar包 并在运行jar包后启动通过java中的runtime类来启动一个nodejs的服务 在做的过程中遇到了一些不小的坑 下面就将其记录下来 二 Runtime类 Runtime cl
  • MySQL基础篇【第一篇】 数据库概述及数据准备、常用命令、查看表结构步骤

    作者简介 大家好我是 每天都要敲代码 一位材料转码农的选手 希望一起努力 一起进步 个人主页 每天都要敲代码的个人主页 系列专栏 MySQL专栏 推荐一款模拟面试 刷题神器 从基础到大厂面试题 点击跳转刷题网站进行注册学习 目录 一 数据库
  • Java课题笔记~ SpringBoot基础配置

    二 基础配置 1 配置文件格式 问题导入 框架常见的配置文件有哪几种形式 1 1 修改服务器端口 http localhost 8080 books 1 gt gt gt http localhost books 1 SpringBoot提
  • ELM:ELM基于近红外光谱的汽油测试集辛烷值含量预测结果对比—Jason niu

    ELM ELM基于近红外光谱的汽油测试集辛烷值含量预测结果对比 Jason niu load spectra data mat temp randperm size NIR 1 P train NIR temp 1 50 T train o
  • IDEA插件-CheckStyle的安装与使用

    目录 一 安装CheckStyle 二 配置CheckStyle 三 使用CheckStyle 一 安装CheckStyle 1 依次访问IDEA gt gt File gt gt Settings gt gt Plugins gt gt
  • 轻松在Firefox中禁用JavaScript

    Want a quick and easy way to toggle JavaScript on and off in Firefox Then you will definitely want to take a good look a
  • 【Linux中高级运维:云计算】第1章:云计算简介+kvm虚拟机安装+日常操作和管理+快照管理

    1 什么是云计算 云计算是一种按量付费的模式 云计算的底层是通过虚拟化技术来实现的 2 云计算的服务类型 2 1IAAS 基础设施即服务 虚拟机 ecs openstack 2 2PAAS 平台即服务 php java docker容器 2
  • 浏览器主页被篡改360篡改浏览器主页,官方四步最完美解决办法

    以前写过一篇浏览器主页被360篡改成他们的主页的文章 那时真的就是气的直接卸载了360 之后通过修改注册表的方式 将主页修改回来 方法很暴力 由于重做了系统 360又被重新安装了回来 结果和以往一样 我的主页还是被强制修改了 但是这次我冷静
  • 3.1-并发控制:互斥

    复习 状态机 状态机 状态机 本次课回答的问题 Q 如何在多处理器上实现线程互斥 本次课主要内容 自旋锁的实现 互斥锁的实现 一 共享内存上的互斥 在共享内存上实现互斥 失败的尝试 mutex bad py 部分 成功的尝试 peterso
  • 3dmax 保存慢 卡死

    解决3DMAX保存慢的方法 方法一 在MAX环境中 按F11会弹出一个编辑框 然后输入 t trackviewnodes n t Max MotionClip Manager deleteTrackViewController t n co
  • 基于tensorflow2.0+使用bert获取中文词、句向量并进行相似度分析

    本文基于transformers库 调用bert模型 对中文 英文的稠密向量进行探究 开始之前还是要说下废话 主要是想吐槽下 为啥写这个东西呢 因为我找了很多文章要么不是不清晰 要么就是基于pytorch 所以特地写了这篇基于tensorf
  • 请求后端返回的验证码显示的情况

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 情况一 数据是图片文件流 二 情况二 直接返回是图片 情况三 uni小程序的登录验证 最后 前言 在实际的项目中验证码登录几乎是每个开发人员的必备操作技能
  • [工具环境] pip&git lfs下载命令

    关键词 pip git lfs pip从git下载指定的提交版本 伴随着大模型的火热发展 PEFT和transformers也是更新频繁 常会看到requirements中安装的软件包来自github中的某个commit hash 比如re
  • 应用编排与管理:核心原理

    本节课程要点 K8s 资源的重要元信息 使用阿里云服务演示一下如何去修改或查看 K8s 重要元数据 详细分析控制器模式 总结控制器模式特点 资源元信息 1 Kubernetes 资源对象 首先 我们来回顾一下 Kubernetes 的资源对
  • g2o的基本使用

    参考 https www jianshu com p e16ffb5b265d 参考 https zhuanlan zhihu com p 36889150 图是一种数据结构 在图优化中 用顶点 vertex 表示优化变量 用边 edge
  • Smali--Dalvik虚拟机指令语言-->【android_smali语法学习一】

    最近一周在研究rom移植 所以就对Smali语言学习了一下 Smali语言其实就是Davlik的寄存器语言 Smali语言就是android的应用程序 apk通过apktool反编译出来的都有一个smali文件夹 里面都是以 smali结尾
  • 基于当前系统制作docker镜像

    1 通过tar 备份目录 tar cvpf home buildrpm tar directory exclude proc exclude sys exclude dev exclude run root localhost home l
  • 不能安装64位office提示已安装32位的

    问题描述 安装64位office办公软件的时候提示已经安装32位的office办公软件所以无法继续安装 但实际上之前安装的32位的office办公软件已经卸载了 问题现象截图如下 解决办法 从问题描述中 我们其实已经能够看出问题原因了 类似
  • React的超详细讲解

    React React的重点 webpack webpack 是一个现代 JavaScript 应用程序的静态模块打包器 module bundler 当 webpack 处理应用程序时 它会递归地构建一个依赖关系图 dependency
  • 虚幻引擎程序化资源生成框架PCG 之 UPCGBlueprintElement源码笔记(一)

    UPCGBlueprintElement是PCGGraph中自定义节点的基类 但官方目前还没有给出详细的文档 所以从源代码里找点答案 文章目录 可覆盖函数 Override Functions Excute 和 Excute with Co