世界对象是 RenderWare 场景的核心

enderWare 世界(World)模块的 API 声明,主要提供了操作场景世界(RpWorld)、扇区(RpWorldSector)、以及全局/局部光源、材质、模型等的接口。下面帮你梳理它的用途和结构:


1️⃣ C++ 兼容宏

 
#ifdef __cplusplus extern "C" { #endif
  • RenderWare 是 C 语言库,用 extern "C" 保证在 C++ 下链接不会被 name mangling。

  • 所有函数都是 C 风格导出。


2️⃣ 世界注册/管理

 
extern RwPluginRegistry worldTKList; extern void _rpWorldRegisterWorld(RpWorld * world, RwUInt32 memorySize); extern void _rpWorldUnregisterWorld(RpWorld * world);
  • worldTKList:RenderWare 内部维护的世界对象注册表。

  • _rpWorldRegisterWorld / _rpWorldUnregisterWorld:把 RpWorld 对象加入或移出全局管理列表,用于内存管理和插件支持。


3️⃣ 辅助函数(内部 API,_rp 开头)

 
extern RwBool _rpWorldFindBBox(RpWorld * world, RwBBox * boundingBox); extern RpWorld *_rpWorldSetupSectorBoundingBoxes(RpWorld *world); extern void _rpWorldSectorDeinstanceAll(RpSector * sector); extern void _rpWorldSectorDestroyRecurse(RpSector * sector);
  • _rpWorldFindBBox:计算世界的包围盒(BoundingBox)。

  • _rpWorldSetupSectorBoundingBoxes:为每个扇区生成 BSP 包围盒(用于空间分割)。

  • _rpWorldSectorDeinstanceAll / _rpWorldSectorDestroyRecurse:扇区资源释放,递归销毁。


4️⃣ 光源枚举

 
extern RwBool _rpWorldForAllGlobalLights(RpLightCallBack callBack, void *pData); extern RpWorldSector *_rpWorldSectorForAllLocalLights(RpWorldSector *sector, RpLightCallBack callBack, void *pData);
  • 遍历世界中的光源,支持全局光和局部光回调处理。


5️⃣ 世界几何访问

 
extern RpWorld *RpWorldLock(RpWorld * world); extern RpWorld *RpWorldUnlock(RpWorld * world);
  • 锁定/解锁世界对象,保证多线程访问时数据安全(通常用于编辑几何数据或批量修改)。


6️⃣ 世界对象操作

 
extern RwBool RpWorldDestroy(RpWorld * world); extern RpWorld *RpWorldCreate(RwBBox * boundingBox); extern RwBool RpWorldInstance(RpWorld *world);
  • 创建/销毁 RpWorld 对象。

  • RpWorldInstance:实例化世界,准备渲染或处理。


7️⃣ 枚举场景对象

 
extern RpWorld *RpWorldForAllClumps(RpWorld * world, RpClumpCallBack fpCallBack, void *pData); extern RpWorld *RpWorldForAllMaterials(RpWorld * world, RpMaterialCallBack fpCallBack, void *pData); extern RpWorld *RpWorldForAllLights(RpWorld * world, RpLightCallBack fpCallBack, void *pData); extern RpWorld *RpWorldForAllWorldSectors(RpWorld * world, RpWorldSectorCallBack fpCallBack, void *pData);
  • 提供枚举函数,遍历世界中 模型(Clump)、材质、光源、扇区

  • 通过回调函数处理每个对象。


8️⃣ 渲染与回调

 
extern RpWorld *RpWorldRender(RpWorld * world); extern RpWorld *RpWorldSetSectorRenderCallBack(RpWorld * world, RpWorldSectorCallBackRender fpCallBack); extern RpWorldSectorCallBackRender RpWorldGetSectorRenderCallBack(const RpWorld * world);
  • RpWorldRender:渲染整个世界。

  • RpWorldSetSectorRenderCallBack:设置每个扇区渲染回调(可以自定义渲染逻辑)。


9️⃣ 插件系统

 
extern RwBool RpWorldPluginAttach(void); extern RwInt32 RpWorldRegisterPlugin(RwInt32 size, RwUInt32 pluginID, RwPluginObjectConstructor constructCB, RwPluginObjectDestructor destructCB, RwPluginObjectCopy copyCB); extern RwInt32 RpWorldRegisterPluginStream(RwUInt32 pluginID, ...);
  • RenderWare 世界对象可以挂载插件(比如 LOD、碰撞、材质扩展等)。

  • RpWorldPluginAttach:挂接世界插件的入口。

  • RpWorldRegisterPlugin / RpWorldRegisterPluginStream:注册插件数据结构和序列化接口。


🔑 总结

  • _rpWorldXXX:内部 API(stealth-API),一般 RenderWare 内部或插件使用。

  • RpWorldXXX:公开 API,给用户创建、销毁、渲染、遍历世界对象。

  • 世界对象是 RenderWare 场景的核心,几乎所有渲染和动画操作都依赖它。

  • 挂载插件(RpWorldPluginAttach)必须在创建世界之前调用。

posted on 2025-10-08 00:24  lydstory  阅读(16)  评论(0)    收藏  举报

导航