GEO_BONE GeoLayout command (#913)
Some checks are pending
Build coop / build-linux (push) Waiting to run
Build coop / build-steamos (push) Waiting to run
Build coop / build-windows-opengl (push) Waiting to run
Build coop / build-windows-directx (push) Waiting to run
Build coop / build-macos-arm (push) Waiting to run
Build coop / build-macos-intel (push) Waiting to run

This commit is contained in:
ManIsCat2 2025-08-20 06:16:32 +03:30 committed by GitHub
parent 6e4373adc9
commit 4fb5375d0d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
17 changed files with 273 additions and 12 deletions

View file

@ -3071,6 +3071,9 @@ GRAPH_NODE_TYPE_HELD_OBJ = (0x02E | GRAPH_NODE_TYPE_FUNCTIONAL)
--- @type integer
GRAPH_NODE_TYPE_CULLING_RADIUS = 0x02F
--- @type integer
GRAPH_NODE_TYPE_BONE = 0x030
--- @type integer
GFX_NUM_MASTER_LISTS = 8
@ -11050,6 +11053,9 @@ ANIM_FLAG_6 = (1 << 6)
--- @type integer
ANIM_FLAG_7 = (1 << 7)
--- @type integer
ANIM_FLAG_BONE_TRANS = (1 << 8)
--- @type integer
OBJECT_MAX_BHV_STACK = 16

View file

@ -450,7 +450,7 @@ function get_exclamation_box_contents()
end
--- @param node GraphNode | FnGraphNode
--- @return GraphNode | GraphNodeAnimatedPart | GraphNodeBackground | GraphNodeBillboard | GraphNodeCamera | GraphNodeCullingRadius | GraphNodeDisplayList | GraphNodeGenerated | GraphNodeHeldObject | GraphNodeLevelOfDetail | GraphNodeMasterList | GraphNodeObject | GraphNodeObjectParent | GraphNodeOrthoProjection | GraphNodePerspective | GraphNodeRotation | GraphNodeScale | GraphNodeShadow | GraphNodeStart | GraphNodeSwitchCase | GraphNodeTranslation | GraphNodeTranslationRotation
--- @return GraphNode | GraphNodeAnimatedPart | GraphNodeBackground | GraphNodeBillboard | GraphNodeCamera | GraphNodeCullingRadius | GraphNodeDisplayList | GraphNodeGenerated | GraphNodeHeldObject | GraphNodeLevelOfDetail | GraphNodeMasterList | GraphNodeObject | GraphNodeObjectParent | GraphNodeOrthoProjection | GraphNodePerspective | GraphNodeRotation | GraphNodeScale | GraphNodeShadow | GraphNodeStart | GraphNodeSwitchCase | GraphNodeTranslation | GraphNodeTranslationRotation | GraphNodeBone
--- Returns the specific GraphNode(...) the node is part of.
--- Basically the reverse of `.node` or `.fnNode`
function cast_graph_node(node)

View file

@ -870,6 +870,13 @@
--- @field public node GraphNode
--- @field public translation Vec3s
--- @class GraphNodeBone
--- @field public displayList Pointer_Gfx
--- @field public node GraphNode
--- @field public rotation Vec3s
--- @field public scale Vec3f
--- @field public translation Vec3s
--- @class GraphNodeCamera
--- @field public fnNode FnGraphNode
--- @field public focus Vec3f

View file

@ -273,6 +273,26 @@ static s64 ParseGeoSymbolArg(GfxData* aGfxData, DataNode<GeoLayout>* aNode, u64&
return; \
}
#define geo_symbol_11(symb, n) \
if (_Symbol == #symb) { \
s64 _Arg0 = ParseGeoSymbolArg(aGfxData, aNode, aTokenIndex); \
s64 _Arg1 = ParseGeoSymbolArg(aGfxData, aNode, aTokenIndex); \
s64 _Arg2 = ParseGeoSymbolArg(aGfxData, aNode, aTokenIndex); \
s64 _Arg3 = ParseGeoSymbolArg(aGfxData, aNode, aTokenIndex); \
s64 _Arg4 = ParseGeoSymbolArg(aGfxData, aNode, aTokenIndex); \
s64 _Arg5 = ParseGeoSymbolArg(aGfxData, aNode, aTokenIndex); \
s64 _Arg6 = ParseGeoSymbolArg(aGfxData, aNode, aTokenIndex); \
s64 _Arg7 = ParseGeoSymbolArg(aGfxData, aNode, aTokenIndex); \
s64 _Arg8 = ParseGeoSymbolArg(aGfxData, aNode, aTokenIndex); \
s64 _Arg9 = ParseGeoSymbolArg(aGfxData, aNode, aTokenIndex); \
s64 _Arg10 = ParseGeoSymbolArg(aGfxData, aNode, aTokenIndex); \
if (n != 0) { aGfxData->mPointerList.Add(aHead + n); } \
GeoLayout _Gl[] = { symb(_Arg0, _Arg1, _Arg2, _Arg3, _Arg4, _Arg5, _Arg6, _Arg7, _Arg8, _Arg9, _Arg10) }; \
memcpy(aHead, _Gl, sizeof(_Gl)); \
aHead += (sizeof(_Gl) / sizeof(_Gl[0])); \
return; \
}
static void ParseGeoSymbol(GfxData* aGfxData, DataNode<GeoLayout>* aNode, GeoLayout*& aHead, u64& aTokenIndex, Array<u64>& aSwitchNodes) {
const String& _Symbol = aNode->mTokens[aTokenIndex++];
@ -322,6 +342,8 @@ static void ParseGeoSymbol(GfxData* aGfxData, DataNode<GeoLayout>* aNode, GeoLay
geo_symbol_0(GEO_NOP_1E);
geo_symbol_0(GEO_NOP_1F);
geo_symbol_1(GEO_CULLING_RADIUS, 0);
geo_symbol_8(GEO_BONE, 4);
geo_symbol_11(GEO_BONE_WITH_SCALE, 7);
// Geo function node
if (_Symbol == "GEO_ASM") {

View file

@ -1359,6 +1359,7 @@
- GRAPH_NODE_TYPE_BACKGROUND
- GRAPH_NODE_TYPE_HELD_OBJ
- GRAPH_NODE_TYPE_CULLING_RADIUS
- GRAPH_NODE_TYPE_BONE
- GFX_NUM_MASTER_LISTS
- GEO_CONTEXT_CREATE
- GEO_CONTEXT_RENDER
@ -4666,6 +4667,7 @@
- ANIM_FLAG_5
- ANIM_FLAG_6
- ANIM_FLAG_7
- ANIM_FLAG_BONE_TRANS
- OBJECT_MAX_BHV_STACK
- OBJECT_NUM_REGULAR_FIELDS
- OBJECT_NUM_CUSTOM_FIELDS

View file

@ -42,6 +42,7 @@
- [GraphNodeAnimatedPart](#GraphNodeAnimatedPart)
- [GraphNodeBackground](#GraphNodeBackground)
- [GraphNodeBillboard](#GraphNodeBillboard)
- [GraphNodeBone](#GraphNodeBone)
- [GraphNodeCamera](#GraphNodeCamera)
- [GraphNodeCullingRadius](#GraphNodeCullingRadius)
- [GraphNodeDisplayList](#GraphNodeDisplayList)
@ -1292,6 +1293,20 @@
<br />
## [GraphNodeBone](#GraphNodeBone)
| Field | Type | Access |
| ----- | ---- | ------ |
| displayList | `Pointer` <`Gfx`> | |
| node | [GraphNode](structs.md#GraphNode) | read-only |
| rotation | [Vec3s](structs.md#Vec3s) | read-only |
| scale | [Vec3f](structs.md#Vec3f) | read-only |
| translation | [Vec3s](structs.md#Vec3s) | read-only |
[:arrow_up_small:](#)
<br />
## [GraphNodeCamera](#GraphNodeCamera)
| Field | Type | Access |

View file

@ -481,5 +481,34 @@ enum SkyBackgroundParams {
CMD_BBH(0x23, 0x00, param), \
CMD_W(luaTokenIndex)
/**
* 0x24: Create a scene graph node that is rotated by the object's animation + an initial rotation with optional default scale
* 0x01: u8 params/drawingLayer
* 0b1000_0000 if set, enable scale and drawingLayer field
* 0b0000_1111 drawingLayer
* 0x02-0x03: unused
* 0x04: s16 xTranslation
* 0x06: s16 yTranslation
* 0x08: s16 zTranslation
* 0x0A: s16 xRotation
* 0x0C: s16 yRotation
* 0x0E: s16 zRotation
* if MSbit of params is set:
* 0x10: u32 xScale
* 0x14: u32 yScale
* 0x18: u32 zScale
* 0x1C: displayList: display list segmented address
* else:
* 0x10: displayList: display list segmented address
*/
#define GEO_BONE(layer, tx, ty, tz, rx, ry, rz, displayList) \
CMD_BBH(0x24, (0x00 | layer), 0x0000), \
CMD_HHHHHH(tx, ty, tz, rx, ry, rz), \
CMD_PTR(displayList)
#define GEO_BONE_WITH_SCALE(layer, tx, ty, tz, rx, ry, rz, sx, sy, sz, displayList) \
CMD_BBH(0x24, (0x80 | layer), 0x0000), \
CMD_HHHHHH(tx, ty, tz, rx, ry, rz), \
CMD_W(sx), CMD_W(sy), CMD_W(sz), \
CMD_PTR(displayList)
#endif // GEO_COMMANDS_H

View file

@ -103,14 +103,15 @@ struct VblankHandler
OSMesg msg;
};
#define ANIM_FLAG_NOLOOP (1 << 0) // 0x01
#define ANIM_FLAG_BACKWARD (1 << 1) // 0x02
#define ANIM_FLAG_2 (1 << 2) // 0x04
#define ANIM_FLAG_HOR_TRANS (1 << 3) // 0x08
#define ANIM_FLAG_VERT_TRANS (1 << 4) // 0x10
#define ANIM_FLAG_5 (1 << 5) // 0x20
#define ANIM_FLAG_6 (1 << 6) // 0x40
#define ANIM_FLAG_7 (1 << 7) // 0x80
#define ANIM_FLAG_NOLOOP (1 << 0) // 0x01
#define ANIM_FLAG_BACKWARD (1 << 1) // 0x02
#define ANIM_FLAG_2 (1 << 2) // 0x04
#define ANIM_FLAG_HOR_TRANS (1 << 3) // 0x08
#define ANIM_FLAG_VERT_TRANS (1 << 4) // 0x10
#define ANIM_FLAG_5 (1 << 5) // 0x20
#define ANIM_FLAG_6 (1 << 6) // 0x40
#define ANIM_FLAG_7 (1 << 7) // 0x80
#define ANIM_FLAG_BONE_TRANS (1 << 8)
struct Animation {
// TODO: Optimize this later if possible.

View file

@ -47,6 +47,7 @@ GeoLayoutCommandProc GeoLayoutJumpTable[] = {
geo_layout_cmd_node_background_ext,
geo_layout_cmd_node_switch_case_ext,
geo_layout_cmd_node_generated_ext,
geo_layout_cmd_bone,
};
struct GraphNode gObjParentGraphNode;
@ -846,6 +847,47 @@ void geo_layout_cmd_node_generated_ext(void) {
gGeoLayoutCommand += 0x08 << CMD_SIZE_SHIFT;
}
/*
0x24: Create a scene graph node that is rotated by the object's animation + an initial rotation.
*/
void geo_layout_cmd_bone(void) {
struct GraphNodeBone *graphNode;
Vec3s translation;
Vec3s rotation;
s32 params = cur_geo_cmd_u8(0x01);
s32 drawingLayer = params;
Vec3f scale;
vec3f_copy(scale, gVec3fOne);
void *displayList;
s16 *cmdPos = (s16 *) gGeoLayoutCommand;
cmdPos = read_vec3s(translation, &cmdPos[2]);
cmdPos = read_vec3s(rotation, &cmdPos[0]);
if (params & 0x80) {
drawingLayer &= 0x0F;
vec3f_set(scale,
cur_geo_cmd_u32(0x10) / 65536.0f,
cur_geo_cmd_u32(0x14) / 65536.0f,
cur_geo_cmd_u32(0x18) / 65536.0f
);
cmdPos += 6 << CMD_SIZE_SHIFT;
}
displayList = *(void **) &cmdPos[0];
cmdPos += 2 << CMD_SIZE_SHIFT;
graphNode = init_graph_node_bone(
gGraphNodePool, NULL,
drawingLayer, displayList,
translation, rotation,
scale);
register_scene_graph_node(&graphNode->node);
gGeoLayoutCommand = (u8 *) cmdPos;
}
struct GraphNode *process_geo_layout(struct DynamicPool *pool, void *segptr) {
// set by register_scene_graph_node when gCurGraphNodeIndex is 0
// and gCurRootGraphNode is NULL

View file

@ -84,6 +84,7 @@ void geo_layout_cmd_node_culling_radius(void);
void geo_layout_cmd_node_background_ext(void);
void geo_layout_cmd_node_switch_case_ext(void);
void geo_layout_cmd_node_generated_ext(void);
void geo_layout_cmd_bone(void);
struct GraphNode *process_geo_layout(struct DynamicPool *a0, void *segptr);

View file

@ -551,6 +551,30 @@ struct GraphNodeHeldObject *init_graph_node_held_object(struct DynamicPool *pool
return graphNode;
}
/**
* Allocates and returns a newly created bone node with initial rotation/translation
*/
struct GraphNodeBone *init_graph_node_bone(struct DynamicPool *pool,
struct GraphNodeBone *graphNode,
s32 drawingLayer, void *displayList,
Vec3s translation, Vec3s rotation,
Vec3f scale) {
if (pool != NULL) {
graphNode = dynamic_pool_alloc(pool, sizeof(struct GraphNodeBone));
}
if (graphNode != NULL) {
init_scene_graph_node_links(&graphNode->node, GRAPH_NODE_TYPE_BONE);
vec3s_copy(graphNode->translation, translation);
vec3s_copy(graphNode->rotation, rotation);
vec3f_copy(graphNode->scale, scale);
graphNode->node.flags = (drawingLayer << 8) | (graphNode->node.flags & 0xFF);
graphNode->displayList = dynos_gfx_get_writable_display_list(displayList);
}
return graphNode;
}
/**
* Adds 'childNode' to the end of the list children from 'parent'
*/

View file

@ -51,6 +51,7 @@
#define GRAPH_NODE_TYPE_BACKGROUND (0x02C | GRAPH_NODE_TYPE_FUNCTIONAL)
#define GRAPH_NODE_TYPE_HELD_OBJ (0x02E | GRAPH_NODE_TYPE_FUNCTIONAL)
#define GRAPH_NODE_TYPE_CULLING_RADIUS 0x02F
#define GRAPH_NODE_TYPE_BONE 0x030
// The number of master lists. A master list determines the order and render
// mode with which display lists are drawn.
@ -377,6 +378,18 @@ struct GraphNodeCullingRadius
u8 pad1E[2];
};
/**
* GraphNodeAnimatedPart with initial rotation and scale values.
*/
struct GraphNodeBone
{
struct GraphNode node;
Gfx *displayList;
Vec3s translation;
Vec3s rotation;
Vec3f scale;
};
extern struct GraphNodeMasterList *gCurGraphNodeMasterList;
extern struct GraphNodePerspective *gCurGraphNodeCamFrustum;
extern struct GraphNodeCamera *gCurGraphNodeCamera;
@ -433,6 +446,11 @@ struct GraphNodeBackground *init_graph_node_background(struct DynamicPool *pool,
struct GraphNodeHeldObject *init_graph_node_held_object(struct DynamicPool *pool, struct GraphNodeHeldObject *sp1c,
struct Object *objNode, Vec3s translation,
GraphNodeFunc nodeFunc, s32 playerIndex);
struct GraphNodeBone *init_graph_node_bone(struct DynamicPool *pool,
struct GraphNodeBone *graphNode,
s32 drawingLayer, void *displayList,
Vec3s translation, Vec3s rotation,
Vec3f scale);
struct GraphNode *geo_add_child(struct GraphNode *parent, struct GraphNode *childNode);
struct GraphNode* geo_remove_child_from_parent(struct GraphNode* parent, struct GraphNode* graphNode);
struct GraphNode *geo_remove_child(struct GraphNode *graphNode);

View file

@ -1086,9 +1086,14 @@ static void anim_process(Vec3f translation, Vec3s rotation, u8 *animType, s16 an
}
if (*animType == ANIM_TYPE_ROTATION) {
rotation[0] = retrieve_animation_value(gCurAnim, animFrame, animAttribute);
rotation[1] = retrieve_animation_value(gCurAnim, animFrame, animAttribute);
rotation[2] = retrieve_animation_value(gCurAnim, animFrame, animAttribute);
// GEO_ANIMATED_PART: rotation = (0 + AnimValue)
// GEO_BONE: rotation = (BoneRotation + AnimValue)
rotation[0] += retrieve_animation_value(gCurAnim, animFrame, animAttribute);
rotation[1] += retrieve_animation_value(gCurAnim, animFrame, animAttribute);
rotation[2] += retrieve_animation_value(gCurAnim, animFrame, animAttribute);
if (gCurAnim->flags & ANIM_FLAG_BONE_TRANS) {
*animType = ANIM_TYPE_TRANSLATION;
}
}
}
@ -1707,6 +1712,77 @@ void geo_process_held_object(struct GraphNodeHeldObject *node) {
}
}
/**
* Render an animated part with initial rotation and scale values.
*/
static void geo_process_bone(struct GraphNodeBone *node) {
if (gCurMarioBodyState && !gCurGraphNodeHeldObject) {
gCurMarioBodyState->currAnimPart++;
}
Mat4 matrix;
Vec3s rotation;
Vec3f translation;
Vec3f scale;
// Sanity check our stack index, If we above or equal to our stack size. Return to prevent OOB\.
if ((gMatStackIndex + 1) >= MATRIX_STACK_SIZE) { LOG_ERROR("Preventing attempt to exceed the maximum size %i for our matrix stack with size of %i.", MATRIX_STACK_SIZE - 1, gMatStackIndex); return; }
u16 *animAttribute = gCurrAnimAttribute;
u8 animType = gCurAnimType;
// current frame
vec3s_copy(rotation, node->rotation);
vec3s_to_vec3f(translation, node->translation);
vec3f_copy(scale, node->scale);
anim_process(translation, rotation, &gCurAnimType, gCurrAnimFrame, &gCurrAnimAttribute);
mtxf_rotate_xyz_and_translate(matrix, translation, rotation);
mtxf_scale_vec3f(matrix, matrix, scale);
mtxf_mul(gMatStack[gMatStackIndex + 1], matrix, gMatStack[gMatStackIndex]);
// previous frame
geo_update_interpolation(node->translation, node->rotation, node->scale,
if (geo_should_interpolate(interp)) {
vec3s_copy(rotation, interp->rotation);
vec3s_to_vec3f(translation, interp->translation);
vec3f_copy(scale, interp->scale);
} else {
vec3s_copy(rotation, node->rotation);
vec3s_to_vec3f(translation, node->translation);
vec3f_copy(scale, node->scale);
}
anim_process(translation, rotation, &animType, gPrevAnimFrame, &animAttribute);
mtxf_rotate_xyz_and_translate(matrix, translation, rotation);
mtxf_scale_vec3f(matrix, matrix, scale);
mtxf_mul(gMatStackPrev[gMatStackIndex + 1], matrix, gMatStackPrev[gMatStackIndex]);
);
// Increment the matrix stack, If we fail to do so. Just return.
if (!increment_mat_stack()) { return; }
// Mario anim part pos
if (gCurMarioBodyState && !gCurGraphNodeHeldObject && gCurMarioBodyState->currAnimPart > MARIO_ANIM_PART_NONE && gCurMarioBodyState->currAnimPart < MARIO_ANIM_PART_MAX) {
get_pos_from_transform_mtx(
gCurMarioBodyState->animPartsPos[gCurMarioBodyState->currAnimPart],
gMatStack[gMatStackIndex],
*gCurGraphNodeCamera->matrixPtr
);
}
if (gCurGraphNodeMarioState != NULL) {
Vec3f translated = { 0 };
get_pos_from_transform_mtx(translated, gMatStack[gMatStackIndex], *gCurGraphNodeCamera->matrixPtr);
gCurGraphNodeMarioState->minimumBoneY = fmin(gCurGraphNodeMarioState->minimumBoneY, translated[1] - gCurGraphNodeMarioState->marioObj->header.gfx.pos[1]);
}
if (node->displayList != NULL) {
geo_append_display_list(node->displayList, node->node.flags >> 8);
}
if (node->node.children != NULL) {
geo_process_node_and_siblings(node->node.children);
}
gMatStackIndex--;
}
/**
* Processes the children of the given GraphNode if it has any
*/
@ -1830,6 +1906,9 @@ void geo_process_node_and_siblings(struct GraphNode *firstNode) {
case GRAPH_NODE_TYPE_HELD_OBJ:
geo_process_held_object((struct GraphNodeHeldObject *) curGraphNode);
break;
case GRAPH_NODE_TYPE_BONE:
geo_process_bone((struct GraphNodeBone *) curGraphNode);
break;
default:
geo_try_process_children((struct GraphNode *) curGraphNode);
break;

View file

@ -1125,6 +1125,15 @@ static struct LuaObjectField sGraphNodeBillboardFields[LUA_GRAPH_NODE_BILLBOARD_
{ "translation", LVT_COBJECT, offsetof(struct GraphNodeBillboard, translation), true, LOT_VEC3S, 1, sizeof(Vec3s) },
};
#define LUA_GRAPH_NODE_BONE_FIELD_COUNT 5
static struct LuaObjectField sGraphNodeBoneFields[LUA_GRAPH_NODE_BONE_FIELD_COUNT] = {
{ "displayList", LVT_COBJECT_P, offsetof(struct GraphNodeBone, displayList), false, LOT_GFX, 1, sizeof(Gfx*) },
{ "node", LVT_COBJECT, offsetof(struct GraphNodeBone, node), true, LOT_GRAPHNODE, 1, sizeof(struct GraphNode) },
{ "rotation", LVT_COBJECT, offsetof(struct GraphNodeBone, rotation), true, LOT_VEC3S, 1, sizeof(Vec3s) },
{ "scale", LVT_COBJECT, offsetof(struct GraphNodeBone, scale), true, LOT_VEC3F, 1, sizeof(Vec3f) },
{ "translation", LVT_COBJECT, offsetof(struct GraphNodeBone, translation), true, LOT_VEC3S, 1, sizeof(Vec3s) },
};
#define LUA_GRAPH_NODE_CAMERA_FIELD_COUNT 10
static struct LuaObjectField sGraphNodeCameraFields[LUA_GRAPH_NODE_CAMERA_FIELD_COUNT] = {
// { "config", LVT_???, offsetof(struct GraphNodeCamera, config), false, LOT_???, 1, sizeof(union { ... }) }, <--- UNIMPLEMENTED
@ -2914,6 +2923,7 @@ struct LuaObjectTable sLuaObjectAutogenTable[LOT_AUTOGEN_MAX - LOT_AUTOGEN_MIN]
{ LOT_GRAPHNODEANIMATEDPART, sGraphNodeAnimatedPartFields, LUA_GRAPH_NODE_ANIMATED_PART_FIELD_COUNT },
{ LOT_GRAPHNODEBACKGROUND, sGraphNodeBackgroundFields, LUA_GRAPH_NODE_BACKGROUND_FIELD_COUNT },
{ LOT_GRAPHNODEBILLBOARD, sGraphNodeBillboardFields, LUA_GRAPH_NODE_BILLBOARD_FIELD_COUNT },
{ LOT_GRAPHNODEBONE, sGraphNodeBoneFields, LUA_GRAPH_NODE_BONE_FIELD_COUNT },
{ LOT_GRAPHNODECAMERA, sGraphNodeCameraFields, LUA_GRAPH_NODE_CAMERA_FIELD_COUNT },
{ LOT_GRAPHNODECULLINGRADIUS, sGraphNodeCullingRadiusFields, LUA_GRAPH_NODE_CULLING_RADIUS_FIELD_COUNT },
{ LOT_GRAPHNODEDISPLAYLIST, sGraphNodeDisplayListFields, LUA_GRAPH_NODE_DISPLAY_LIST_FIELD_COUNT },
@ -3043,6 +3053,7 @@ const char *sLuaLotNames[] = {
[LOT_GRAPHNODEANIMATEDPART] = "GraphNodeAnimatedPart",
[LOT_GRAPHNODEBACKGROUND] = "GraphNodeBackground",
[LOT_GRAPHNODEBILLBOARD] = "GraphNodeBillboard",
[LOT_GRAPHNODEBONE] = "GraphNodeBone",
[LOT_GRAPHNODECAMERA] = "GraphNodeCamera",
[LOT_GRAPHNODECULLINGRADIUS] = "GraphNodeCullingRadius",
[LOT_GRAPHNODEDISPLAYLIST] = "GraphNodeDisplayList",

View file

@ -63,6 +63,7 @@ enum LuaObjectAutogenType {
LOT_GRAPHNODEANIMATEDPART,
LOT_GRAPHNODEBACKGROUND,
LOT_GRAPHNODEBILLBOARD,
LOT_GRAPHNODEBONE,
LOT_GRAPHNODECAMERA,
LOT_GRAPHNODECULLINGRADIUS,
LOT_GRAPHNODEDISPLAYLIST,

View file

@ -1568,6 +1568,7 @@ char gSmluaConstants[] = ""
"GRAPH_NODE_TYPE_BACKGROUND=(0x02C | GRAPH_NODE_TYPE_FUNCTIONAL)\n"
"GRAPH_NODE_TYPE_HELD_OBJ=(0x02E | GRAPH_NODE_TYPE_FUNCTIONAL)\n"
"GRAPH_NODE_TYPE_CULLING_RADIUS=0x02F\n"
"GRAPH_NODE_TYPE_BONE=0x030\n"
"GFX_NUM_MASTER_LISTS=8\n"
"GEO_CONTEXT_CREATE=0\n"
"GEO_CONTEXT_RENDER=1\n"
@ -4575,6 +4576,7 @@ char gSmluaConstants[] = ""
"ANIM_FLAG_5=(1 << 5)\n"
"ANIM_FLAG_6=(1 << 6)\n"
"ANIM_FLAG_7=(1 << 7)\n"
"ANIM_FLAG_BONE_TRANS=(1 << 8)\n"
"OBJECT_MAX_BHV_STACK=16\n"
"OBJECT_NUM_REGULAR_FIELDS=0x50\n"
"OBJECT_NUM_CUSTOM_FIELDS=0x40\n"

View file

@ -883,6 +883,7 @@ static GraphNodeLot graphNodeLots[] = {
{ GRAPH_NODE_TYPE_SWITCH_CASE, LOT_GRAPHNODESWITCHCASE },
{ GRAPH_NODE_TYPE_TRANSLATION, LOT_GRAPHNODETRANSLATION },
{ GRAPH_NODE_TYPE_TRANSLATION_ROTATION, LOT_GRAPHNODETRANSLATIONROTATION },
{ GRAPH_NODE_TYPE_BONE, LOT_GRAPHNODEBONE },
};
int smlua_func_cast_graph_node(lua_State* L) {