@@ -268,9 +268,13 @@ void geo_layout_cmd_node_perspective(void) {
268268 gGeoLayoutCommand += 4 << CMD_SIZE_SHIFT ;
269269 }
270270
271- graphNode = init_graph_node_perspective (gGraphNodePool , NULL , (f32 ) fov , near , far , frustumFunc , 0 );
272-
273- register_scene_graph_node (& graphNode -> fnNode .node );
271+ {
272+ f32 fovF = (f32 ) fov ;
273+ CALL_CANCELLABLE_EVENT (GeoLayoutNodePerspective , & fovF , & near , & far , & frustumFunc ) {
274+ graphNode = init_graph_node_perspective (gGraphNodePool , NULL , fovF , near , far , frustumFunc , 0 );
275+ register_scene_graph_node (& graphNode -> fnNode .node );
276+ }
277+ }
274278
275279 gGeoLayoutCommand += 0x08 << CMD_SIZE_SHIFT ;
276280}
@@ -335,16 +339,14 @@ void geo_layout_cmd_node_level_of_detail(void) {
335339 Used for animating coins, blinking, color selection, etc.
336340*/
337341void geo_layout_cmd_node_switch_case (void ) {
338- struct GraphNodeSwitchCase * graphNode ;
342+ s16 initialCase = cur_geo_cmd_s16 (0x02 );
343+ GraphNodeFunc func = (GraphNodeFunc ) cur_geo_cmd_ptr (0x04 );
339344
340- graphNode =
341- init_graph_node_switch_case (gGraphNodePool , NULL ,
342- cur_geo_cmd_s16 (0x02 ), // case which is initially selected
343- 0 ,
344- (GraphNodeFunc ) cur_geo_cmd_ptr (0x04 ), // case update function
345- 0 );
346-
347- register_scene_graph_node (& graphNode -> fnNode .node );
345+ CALL_CANCELLABLE_EVENT (GeoLayoutNodeSwitchCase , & initialCase , & func ) {
346+ struct GraphNodeSwitchCase * graphNode =
347+ init_graph_node_switch_case (gGraphNodePool , NULL , initialCase , 0 , func , 0 );
348+ register_scene_graph_node (& graphNode -> fnNode .node );
349+ }
348350
349351 gGeoLayoutCommand += 0x08 << CMD_SIZE_SHIFT ;
350352}
@@ -361,20 +363,21 @@ void geo_layout_cmd_node_switch_case(void) {
361363 cmd+0x10: GraphNodeFunc func
362364*/
363365void geo_layout_cmd_node_camera (void ) {
364- struct GraphNodeCamera * graphNode ;
365- s16 * cmdPos = (s16 * ) & gGeoLayoutCommand [4 ];
366-
366+ s16 type = cur_geo_cmd_s16 (0x02 );
367367 Vec3f pos , focus ;
368+ s16 * cmdPos = (s16 * ) & gGeoLayoutCommand [4 ];
368369
369370 cmdPos = read_vec3s_to_vec3f (pos , cmdPos );
370371 cmdPos = read_vec3s_to_vec3f (focus , cmdPos );
371372
372- graphNode = init_graph_node_camera (gGraphNodePool , NULL , pos , focus ,
373- (GraphNodeFunc ) cur_geo_cmd_ptr (0x10 ), cur_geo_cmd_s16 (0x02 ));
374-
375- register_scene_graph_node (& graphNode -> fnNode .node );
373+ GraphNodeFunc func = (GraphNodeFunc ) cur_geo_cmd_ptr (0x10 );
376374
377- gGeoViews [0 ] = & graphNode -> fnNode .node ;
375+ CALL_CANCELLABLE_EVENT (GeoLayoutNodeCamera , & type , pos , focus , & func ) {
376+ struct GraphNodeCamera * graphNode =
377+ init_graph_node_camera (gGraphNodePool , NULL , pos , focus , func , type );
378+ register_scene_graph_node (& graphNode -> fnNode .node );
379+ gGeoViews [0 ] = & graphNode -> fnNode .node ;
380+ }
378381
379382 gGeoLayoutCommand += 0x14 << CMD_SIZE_SHIFT ;
380383}
@@ -537,8 +540,6 @@ void geo_layout_cmd_node_rotation(void) {
537540 [cmd+0x08: void *displayList]
538541*/
539542void geo_layout_cmd_node_scale (void ) {
540- struct GraphNodeScale * graphNode ;
541-
542543 s16 drawingLayer = 0 ;
543544 s16 params = cur_geo_cmd_u8 (0x01 );
544545 f32 scale = cur_geo_cmd_u32 (0x04 ) / 65536.0f ;
@@ -550,9 +551,11 @@ void geo_layout_cmd_node_scale(void) {
550551 gGeoLayoutCommand += 4 << CMD_SIZE_SHIFT ;
551552 }
552553
553- graphNode = init_graph_node_scale (gGraphNodePool , NULL , drawingLayer , displayList , scale );
554-
555- register_scene_graph_node (& graphNode -> node );
554+ CALL_CANCELLABLE_EVENT (GeoLayoutNodeScale , & drawingLayer , & scale , & displayList ) {
555+ struct GraphNodeScale * graphNode =
556+ init_graph_node_scale (gGraphNodePool , NULL , drawingLayer , displayList , scale );
557+ register_scene_graph_node (& graphNode -> node );
558+ }
556559
557560 gGeoLayoutCommand += 0x08 << CMD_SIZE_SHIFT ;
558561}
@@ -626,13 +629,14 @@ void geo_layout_cmd_node_billboard(void) {
626629 cmd+0x04: void *displayList
627630*/
628631void geo_layout_cmd_node_display_list (void ) {
629- struct GraphNodeDisplayList * graphNode ;
630632 s32 drawingLayer = cur_geo_cmd_u8 (0x01 );
631633 void * displayList = cur_geo_cmd_ptr (0x04 );
632634
633- graphNode = init_graph_node_display_list (gGraphNodePool , NULL , drawingLayer , displayList );
634-
635- register_scene_graph_node (& graphNode -> node );
635+ CALL_CANCELLABLE_EVENT (GeoLayoutNodeDisplayList , & drawingLayer , & displayList ) {
636+ struct GraphNodeDisplayList * graphNode =
637+ init_graph_node_display_list (gGraphNodePool , NULL , drawingLayer , displayList );
638+ register_scene_graph_node (& graphNode -> node );
639+ }
636640
637641 gGeoLayoutCommand += 0x08 << CMD_SIZE_SHIFT ;
638642}
@@ -644,14 +648,15 @@ void geo_layout_cmd_node_display_list(void) {
644648 cmd+0x06: s16 shadowScale
645649*/
646650void geo_layout_cmd_node_shadow (void ) {
647- struct GraphNodeShadow * graphNode ;
648- u8 shadowType = cur_geo_cmd_s16 (0x02 );
649- u8 shadowSolidity = cur_geo_cmd_s16 (0x04 );
651+ u8 shadowType = (u8 ) cur_geo_cmd_s16 (0x02 );
652+ u8 shadowSolidity = (u8 ) cur_geo_cmd_s16 (0x04 );
650653 s16 shadowScale = cur_geo_cmd_s16 (0x06 );
651654
652- graphNode = init_graph_node_shadow (gGraphNodePool , NULL , shadowScale , shadowSolidity , shadowType );
653-
654- register_scene_graph_node (& graphNode -> node );
655+ CALL_CANCELLABLE_EVENT (GeoLayoutNodeShadow , & shadowType , & shadowSolidity , & shadowScale ) {
656+ struct GraphNodeShadow * graphNode =
657+ init_graph_node_shadow (gGraphNodePool , NULL , shadowScale , shadowSolidity , shadowType );
658+ register_scene_graph_node (& graphNode -> node );
659+ }
655660
656661 gGeoLayoutCommand += 0x08 << CMD_SIZE_SHIFT ;
657662}
@@ -673,13 +678,13 @@ void geo_layout_cmd_node_object_parent(void) {
673678 cmd+0x04: GraphNodeFunc func
674679*/
675680void geo_layout_cmd_node_generated (void ) {
676- struct GraphNodeGenerated * graphNode ;
681+ GraphNodeFunc func = (GraphNodeFunc ) cur_geo_cmd_ptr (0x04 );
682+ s16 param = cur_geo_cmd_s16 (0x02 );
677683
678- graphNode = init_graph_node_generated (gGraphNodePool , NULL ,
679- (GraphNodeFunc ) cur_geo_cmd_ptr (0x04 ), // asm function
680- cur_geo_cmd_s16 (0x02 )); // parameter
681-
682- register_scene_graph_node (& graphNode -> fnNode .node );
684+ CALL_CANCELLABLE_EVENT (GeoLayoutCallASM , & func , & param ) {
685+ struct GraphNodeGenerated * graphNode = init_graph_node_generated (gGraphNodePool , NULL , func , param );
686+ register_scene_graph_node (& graphNode -> fnNode .node );
687+ }
683688
684689 gGeoLayoutCommand += 0x08 << CMD_SIZE_SHIFT ;
685690}
@@ -690,15 +695,14 @@ void geo_layout_cmd_node_generated(void) {
690695 cmd+0x04: GraphNodeFunc backgroundFunc
691696*/
692697void geo_layout_cmd_node_background (void ) {
693- struct GraphNodeBackground * graphNode ;
694-
695- graphNode = init_graph_node_background (
696- gGraphNodePool , NULL ,
697- cur_geo_cmd_s16 (0x02 ), // background ID, or RGBA5551 color if asm function is null
698- (GraphNodeFunc ) cur_geo_cmd_ptr (0x04 ), // asm function
699- 0 );
698+ GraphNodeFunc func = (GraphNodeFunc ) cur_geo_cmd_ptr (0x04 );
699+ s16 param = cur_geo_cmd_s16 (0x02 );
700700
701- register_scene_graph_node (& graphNode -> fnNode .node );
701+ CALL_CANCELLABLE_EVENT (GeoLayoutCallASM , & func , & param ) {
702+ struct GraphNodeBackground * graphNode = init_graph_node_background (
703+ gGraphNodePool , NULL , param , func , 0 );
704+ register_scene_graph_node (& graphNode -> fnNode .node );
705+ }
702706
703707 gGeoLayoutCommand += 0x08 << CMD_SIZE_SHIFT ;
704708}
@@ -787,6 +791,8 @@ struct GraphNode *process_geo_layout(struct AllocOnlyPool *pool, void *segptr) {
787791 gGeoLayoutStack [0 ] = 0 ;
788792 gGeoLayoutStack [1 ] = 0 ;
789793
794+ CALL_EVENT (GeoLayoutBegin , segptr );
795+
790796 if (GameEngine_OTRSigCheck (segptr ) == 1 ){
791797 GeoLayoutExecute (segptr );
792798 } else {
@@ -798,5 +804,6 @@ struct GraphNode *process_geo_layout(struct AllocOnlyPool *pool, void *segptr) {
798804 }
799805 }
800806
807+ CALL_EVENT (GeoLayoutEnd , gCurRootGraphNode );
801808 return gCurRootGraphNode ;
802809}
0 commit comments