OVR: Render Beacons outside legacy viewport
authorAndreas Eversberg <jolly@eversberg.eu>
Sun, 15 Apr 2018 05:58:02 +0000 (07:58 +0200)
committerAndreas Eversberg <jolly@eversberg.eu>
Sun, 22 Apr 2018 10:02:46 +0000 (12:02 +0200)
src/mercenary/mercenary2.c
src/mercenary/mercenary3.c
src/mercenary/render.c

index 6bbbbb7..657004b 100644 (file)
@@ -107,6 +107,7 @@ const struct cpu_stop mercenary_stop_at[] = {
        { 0x52C42,      STOP_AT_PATCH_RENDER },                 /* patch away planet check (behind observer) */
        { 0x528C4,      STOP_AT_PATCH_RENDER },                 /* patch away planet check (behind observer) */
        { 0x45806,      STOP_AT_PATCH_RENDER },                 /* patch away planet rendering (would crash without check above) */
+       { 0x53276,      STOP_AT_PATCH_RENDER },                 /* patch away beacon check (not visible on screen) */
        { 0x0,          STOP_AT_END },                          /* end */
 };
 
@@ -173,6 +174,12 @@ void mercenary_patch_render(void)
        case 0x45806: /* just RTS to avoid crashing of rendering functions when planets are behind obersver */
                REG_PC -= 2;
                break;
+       case 0x53276: /* skip that branch, so beacons get rendered outside screen */
+               REG_PC += 2;
+               break;
+       case 0x53284: /* skip point render, because projected coordinates may be invalid outside screen */
+               REG_PC += 4;
+               break;
        }
 }
 
index 0dd7f8d..dd4cda0 100644 (file)
@@ -113,6 +113,7 @@ const struct cpu_stop mercenary_stop_at[] = {
        { 0x53A6C,      STOP_AT_PATCH_RENDER },                 /* patch away planet check (behind observer) */
        { 0x537B0,      STOP_AT_PATCH_RENDER },                 /* patch away planet check (behind observer) */
        { 0x45806,      STOP_AT_PATCH_RENDER },                 /* patch away planet rendering (would crash without check above) */
+       { 0x5406E,      STOP_AT_PATCH_RENDER },                 /* patch away beacon check (not visible on screen) */
        { 0x0,          STOP_AT_END },                          /* end */
 };
 
@@ -209,6 +210,12 @@ void mercenary_patch_render(void)
        case 0x45806: /* just RTS to avoid crashing of rendering functions when planets are behind obersver */
                REG_PC -= 2;
                break;
+       case 0x5406E: /* skip that branch, so beacons get rendered outside screen */
+               REG_PC += 2;
+               break;
+       case 0x54088: /* skip point render, because projected coordinates may be invalid outside screen */
+               REG_PC += 4;
+               break;
        }
 }
 
index b0a35b1..4acbb78 100644 (file)
@@ -1308,6 +1308,8 @@ void render_capture_event(int event)
                break;
        case STOP_AT_POINT_BEACON:
                point_beacon();
+               /* note: we may not call the point-renderer, because projected coordinates are invalid */
+               mercenary_patch_render();
                break;
        case STOP_AT_COORD_BUILDING_EXTERIOR:
                coord_building_exterior();